SQL:将联合查询转换为单个查询

时间:2016-11-24 10:13:23

标签: sql postgresql

我有一个像这样的数据库模式

用户
ID
matricule

文档
ID
标题
user_id(用户的外键)
模式(可以接受PUBLIC或PRIVATE)

我想要检索所有公开的文档以及属于给定用户的所有文档(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' 

运行良好,但我可以用另一种方式实现相同的结果(我在某处读取联合查询对性能有害),例如子查询吗?

非常感谢

2 个答案:

答案 0 :(得分: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?)

答案 1 :(得分: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,在这种情况下我根本不会期望有很大差异)