Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将联合查询转换为联接查询_Sql_Join - Fatal编程技术网

Sql 将联合查询转换为联接查询

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

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