我有一个由3个表组成的简单数据库模式
用户
ID
命名
matricule
文档
ID
串行
user_id(文档的所有者:用户的外键(id))
User_Document (加入表)
USER_ID
document_id
我想要来自两个用户来源的所有文档序列:文档所有者和连接表。该查询由用户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')
如何只使用连接查询来获得相同的结果?我也需要跳过没有序列的文件(这种情况是可能的)
非常感谢
答案 0 :(得分:2)
试试这个:
SELECT d.serial
FROM Document d
LEFT JOIN User_Document ud
ON d.id = ud.document_id
LEFT JOIN users u
on ud.user_id = u.id
LEFT JOIN users u2
ON d.user_id = u2.id
WHERE d.serial IS NOT NULL
AND
(
ISNULL(u.matricule,'') IN ('1234')
OR ISNULL(u2.matricule,'') IN ('1234')
)
答案 1 :(得分:1)
为什么要删除join
?可能最有效的查询将使用exists
:
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'
)
);
为此,您需要users(id, matricule)
,user_documents(document_id, user_id)
和documents(serial, user_id, document_id)
上的索引。
使用索引可以避免重复删除 - 对于这种类型的查询来说,这应该是一个很大的胜利。