我有一个像这样的数据库模式
用户
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'
运行良好,但我可以用另一种方式实现相同的结果(我在某处读取联合查询对性能有害),例如子查询吗?
非常感谢
答案 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,在这种情况下我根本不会期望有很大差异)