2016-07-27 26 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