Sql 将联合查询转换为联接查询
我有一个由3个表组成的简单数据库模式 使用者 身份证件 名称 矩阵 文件 身份证件 电视连续剧 user\u id文档所有者:Userid的外键 用户文档联接表 用户id 文件id 我希望所有文档序列都来自两个用户源:文档所有者和联接表。查询通过用户列表矩阵进行过滤 我通过union query实现了预期目标:Sql 将联合查询转换为联接查询,sql,join,Sql,Join,我有一个由3个表组成的简单数据库模式 使用者 身份证件 名称 矩阵 文件 身份证件 电视连续剧 user\u id文档所有者:Userid的外键 用户文档联接表 用户id 文件id 我希望所有文档序列都来自两个用户源:文档所有者和联接表。查询通过用户列表矩阵进行过滤 我通过union query实现了预期目标: select d.serial from Document d INNER JOIN users u ON u.id = d.user_id where u.matricule
select d.serial from Document d
INNER JOIN users u ON u.id = d.user_id
where u.matricule IN ('1234')
UNION
select d.serial from Document d
inner join User_Document ud on d.id = ud.document_id
inner join users u on ud.user_id = u.id
where u.matricule IN ('1234')
如何仅使用联接查询就获得相同的结果?我还需要跳过没有序列号的文件。这种情况是可能的
非常感谢试试这个:
选择d.serial
来自文件d
左连接用户\文档ud
在d.id=ud.document\u id上
左加入用户u
在ud.user_id=u.id上
左加入用户u2
在d.user_id=u2.id上
其中d.serial不为空
和
“1234”中的ISNULLu.矩阵
或者是“1234”中的nullu2.matricule
为什么要删除联接?最有效的查询可能是: 为此,您需要在usersid、matricule、user_documents文档id、user_id和documents序列、user_id、document_id上建立索引
使用索引可以避免重复的消除,这对于这种类型的查询来说应该是一个巨大的胜利。我不想删除join,而是union。你是对的,当表增长时,我需要一些索引。您的查询也很有效。非常感谢。这个查询可以返回重复的内容,就像现在编写的那样,而您的版本不会。
select d.*
from documents d
where d.serial is not null and
(exists (select 1
from users u
where u.id = d.user_id and u.matricule = '1234'
) or
exists (select 1
from user_document ud join
users u
on u.id = d.user_id
where ud.document_id = d.id and u.matricule = '1234'
)
);