转换联合查询以加入查询

时间:2017-10-24 10:02:36

标签: sql join

我有一个由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')

如何只使用连接查询来获得相同的结果?我也需要跳过没有序列的文件(这种情况是可能的)

非常感谢

2 个答案:

答案 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)上的索引。

使用索引可以避免重复删除 - 对于这种类型的查询来说,这应该是一个很大的胜利。