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

SQL:将联合查询转换为单个查询,sql,postgresql,Sql,Postgresql,我有一个这样的数据库模式 用户 id 矩阵 文档 id 标题 用户id(用户外键) 模式(可接受公共或私有) 我想检索所有公共文档和属于给定用户的所有文档(矩阵) 我做了一个类似这样的联合查询: 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.us

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

用户
id
矩阵

文档
id
标题
用户id(用户外键)
模式(可接受公共或私有)

我想检索所有公共文档和属于给定用户的所有文档(矩阵)

我做了一个类似这样的联合查询:

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' 
哪种方法工作得很好,但是我可以用另一种方法(我在某处读到联合查询对性能有害)获得相同的结果,比如子查询

多谢各位

select distinct *
from document d
Inner join user u ON u.id = d.user_id 
where u.matricule = 'matricule1' or d.mode ='PUBLIC' 
选择DISTINCT
删除重复项,就像
UNION
一样。(也许您只需要选择


选择DISTINCT
删除重复项,就像
UNION
一样。(可能您只需要
选择
?)

假设您只需要
文档
表中的列,这也可以写成:

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,我认为在这种情况下不会有太大的差异)

假设您只需要
文档
表中的列,这也可以写成:

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,我不希望在这种情况下有太大的差异)

。非常感谢:)如果他在两个表中都有主键(大多数表都应该有主键),那么
独立的
真的有必要吗,因为他回来了
*
?这只是吹毛求疵和猜测,我想把这个想法扔出去,反正我+1'ed。@RaduGheorghiu,可能不需要,但OP没有这么快指定pk。非常感谢:)如果他在两个表中都有主键(大多数表都应该有主键),那么
独立的
真的有必要吗,因为他回来了
*
?这只是吹毛求疵和猜测,我想把这个想法扔出去,反正我+1'ed。@RaduGheorghiu,可能不需要,但OP没有指定pk。@a_horse_,没有名字。我正在使用postgreSQL。@一匹没有名字的马。我正在使用postgreSQL。非常感谢,这也是一个很好的解决方案+1 :) . 如何检查查询的执行计划?你有一个好的链接吗?非常感谢,另一个很好的解决方案+1 :) . 如何检查查询的执行计划?你有一个好的链接吗?