2016-11-24 50 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