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 :) . 如何检查查询的执行计划?你有一个好的链接吗?