2016-07-27 68 views
0

我想创建一个与MySQL和PostgreSQL一起工作的通用查询。MySQL和PGSQL的通用查询

对于此查询,我需要选择3个表中的所有列,但结果需要在ID上具有不同的子句以消除重复的行。 实际上在数据库中,有6条记录,但只有3条是不同的: 其中一条出现3次,另一条出现2,最后一条出现。 多次出现的记录完全一样,我只想保留其中的一个。

这是6所记录的画面: 6 records

而且我我想要的是: Just distinct record

这里是MySQL查询:

SELECT 
    * 
FROM 
    table_1 
    INNER JOIN table_2 
    ON table_1.id = table_2.table_1_id 
    INNER JOIN table_3 
    ON table_2.table_3_id = table_3.id 
WHERE 
    table_3.type = 'foo' 
GROUP BY 
    table_1.id 

这是PostgreSQL查询:

SELECT DISTINCT ON (table_1.id) 
    * 
FROM 
    table_1 
    INNER JOIN table_2 
    ON table_1.id = table_2.table_1.id 
    INNER JOIN table_3 
    ON table_2.table_3_id = table_3.id 
WHERE 
    table_3.type = 'foo' 

我没有找到如何创建一个与MySQL和PostgreSQL一起工作的查询

+3

为什么*?当table_2中有多个匹配记录可用于table_1中的值时,您需要哪些值?对“GROUP BY”使用ANSI“GROUP BY”和ANSI规则:对“SELECT”中列出的每一列,在“GROUP BY”中进行聚合或列表。 **你想要解决什么问题?** – Pred

+0

Brut-force解决方案:'select * from(select table_1。*,(select_table from table_2 where table_1.id = table_2.table_1.id order by 限制1)as t2_id,... from table_1)t内连接table_2 on(t.t2_id = table_2.id)...'但是不要试图写“通用”解决方案,因为你失去了大部分优点每个DBMS。改为创建存储函数,并以大多数与DBMS相关的有效方式对每个函数进行编码。 – Abelisto

回答

1

尝试先获取第一个表的独特ID,然后将其余的加入到它们中。

虽然,你仍然会得到一些随机值table_1我想,如果有多个ID与他们不同的值,你不指定你想要的。

SELECT 
    table_1.*, table_2.*, table_3.* 
FROM 
    (SELECT table_1.id FROM table_1 GROUP BY table_1.id) AS distinctIds 
INNER JOIN table_1 ON table_1.id = distinctIds.id 
INNER JOIN table_2 ON distinctIds.id = table_2.table_1_id 
INNER JOIN table_3 ON table_2.table_3_id = table_3.id 
WHERE 
    table_3.type = "foo" 
+0

看起来你忘了第一个FROM之后的“SELECT”,但我用PgSQL和MySQL试了一下我有很好的结果,但是有重复的行 –

+1

请参阅问题的评论。重述:重复意味着什么,删除它们的规则是什么。 table1.id出现两次,还是整个记录出现两次或更多?当出现副本时,您想要获得哪些记录?很难提供这样一个抽象的问题。当一个或多个连接是1:n连接(或m:n)时,会出现 – Pred

+0

重复项,区别可能无济于事,我想知道为什么在psql中支持此构造。 – Jakumi