Postgresql

使用連接時忽略重複項

  • October 31, 2018

我試圖在使用聯接時忽略表中兩個提供程序之間的重複項。

我現在正在使用這個查詢:

SELECT *
FROM A AS a1, A AS a2
WHERE a1.provider <> a2.provider AND a1.etype = a2.etype

不幸的是,該查詢給了我重複項(兩行相同的提供程序,在相反的兩側)。

我試圖忽略在對面出現兩次的行,例如:

etype    provider    etype    provider
hello    aaa         hello    bbb
hello    bbb         hello    aaa

這個dbfiddle 也說明了所需的輸出。

您必須將<>比較替換為<or >。否則,普通的 CROSS JOIN 會產生不包括主對角線的完整笛卡爾積。

現在你得到下一個:

-- AB AC AD
BA -- BC BD
CA CB -- CD
DA DB DC --

代替 :

-- AB AC AD
-- -- BC BD
-- -- -- CD
-- -- -- --

所以你的查詢應該是這樣的:

SELECT *
 FROM       A AS a1
 CROSS JOIN A AS a2  -- my strong advise to use JOIN instead of ',' for readability
WHERE a1.provider < a2.provider -- here is the comparison I've mean
  AND a1.etype    = a2.etype
;

NB

正確的程式碼格式可以極大地提高理解能力。

引用自:https://dba.stackexchange.com/questions/221388