Clo*_*edi 39 sql join left-join outer-join
我有两个具有相似列名的表,我需要从左表中返回在右表中找不到的记录?我有一个主键(列),可以帮助我比较两个表.哪个加入是首选?
Sha*_*r K 53
试试这个
SELECT f.*
FROM first_table f LEFT JOIN second_table s ON f.key=s.key
WHERE s.key is NULL
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请阅读本文:加入Sql Server
Dee*_*kha 34
如果您要求使用T-SQL,那么我们先来看一下基础知识.这里有三种类型的连接,每种连接都有自己的一组逻辑处理阶段:
cross join是最简单的.它只实现一个逻辑查询处理阶段,a Cartesian Product.此阶段对作为连接的输入提供的两个表进行操作,并生成两者的笛卡尔乘积.也就是说,来自一个输入的每一行与来自另一个输入的所有行匹配.因此,如果一个表中有m行而另一个表中有n行,则结果中会得到m×n行.Inner joins:它们应用两个逻辑查询处理阶段:A Cartesian product在交叉连接中的两个输入表之间,然后filters根据您在ON子句中指定的谓词(也称为Join condition)进行排序.接下来是第三种类型的连接Outer Joins:
在outer join你标记表作为preserved使用关键字表格LEFT OUTER JOIN,RIGHT OUTER JOIN或FULL OUTER JOIN之间的表名.该OUTER关键字optional.的LEFT关键字指的行left table被保留; 的RIGHT关键字意味着在各行right table被保留; 和FULL关键字意味着行both的left,并right表将被保留.
第三个逻辑查询处理阶段outer join根据ON谓词标识保留表中未在另一个表中找到匹配项的行.此阶段将这些行添加到由连接的前两个阶段生成的结果表中,并使用NULL标记作为来自这些外部行中的连接的非保留侧的属性的占位符.
现在,如果我们看一下这个问题:要从左表中返回右表中找不到的记录,请使用Left outer join并过滤掉NULL连接右侧属性值的行.
我也喜欢使用NOT EXISTS。在性能方面,如果索引正确,则其性能应与LEFT JOIN相同或更好。加上它更易于阅读。
SELECT Column1
FROM TableA a
WHERE NOT EXISTS ( SELECT Column1
FROM Tableb b
WHERE a.Column1 = b.Column1
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
137245 次 |
| 最近记录: |