2016-11-24 57 views
0

我有一個數據庫架構這樣SQL:變換聯合查詢到單個查詢

用戶
ID
matricule

文件
ID
標題
USER_ID(國外用戶密鑰)
模式(可接受PUBLIC或PRI VATE)

我想找回這是公開的所有文件和屬於特定用戶的所有文件(matricule)

我做了一個聯合查詢是這樣的:

select * document d 
Inner join user u ON u.id = d.user_id 
and u.matricule ='matricule1' 
UNION 
select * from document d 
Inner join user u ON u.id = d.user_id 
where d.mode ='PUBLIC' 

效果很好,但我可以用另一種方式實現相同的結果(我在某處讀取聯合查詢對性能不利),例如子查詢?

非常感謝您

+0

@a_horse_with_no_name。我使用的是PostgreSQL。 – ulquiorra

回答

4
select distinct * 
from document d 
Inner join user u ON u.id = d.user_id 
where u.matricule = 'matricule1' or d.mode ='PUBLIC' 

SELECT DISTINCT刪除重複就像UNION一樣。 (?也許你只想SELECT

+0

太快了。非常感謝:) – ulquiorra

+0

如果他在兩個表中都有主鍵(*因爲大多數表都應該*),那麼'DISTINCT'確實是必須的,因爲他回來了'*'?這只是挑剔和猜測,我認爲只是把這個想法放在那裏,無論如何我都+1了。 –

+0

@RaduGheorghiu,可能不需要,但OP沒有指定PK的。 – jarlh

1

假設你只是想從document表中的列,這也可以寫成:

select * 
from document d 
where exists (select * 
       from "user" u 
       where u.id = d.user_id 
       and u.matricule = 'matricule1') 
or d.mode ='PUBLIC' 

這使得刪除重複不必要其中UNION暗示不和將是必要的爲一個JOIN解決方案。

但是你檢查這兩個解決方案的執行計劃。在某些情況下,UNION解決方案可能確實比上述(或JOIN)更快。這很大程度上取決於DBMS的使用情況(例如,對於Postgres或Oracle,在這種情況下,我不認爲會有很大差異)

+0

。非常感謝,另一個很棒的解決方案。 +1 :)。我如何檢查查詢的執行計劃?你有好鏈接嗎? – ulquiorra