SQL Server 2008 R2:LEFT JOIN为NULL且不存在多个条件
我有以下表格,即test1和test2, 我想显示test1中不存在的记录,这些记录不存在于test2中。SQL Server 2008 R2:LEFT JOIN为NULL且不存在多个条件
表1:
CREATE TABLE test1
(
cola int,
colb varchar(10)
);
表2:
CREATE TABLE test2
(
cola int,
colb varchar(10),
colc varchar(10)
);
插入记录:
INSERT INTO test1 VALUES(1,'a'),(2,'b'),(3,'c');
INSERT INTO test2 VALUES(5,'a','W1'),(2,'b','Z1'),(6,'c','X1');
查询1:使用LEFT JOIN IS NULL和在WHERE子句2个条件
SELECT t1.*
FROM test1 t1
LEFT JOIN test2 t2
ON t1.cola = t2.cola
WHERE t2.cola IS NULL AND t2.colc IN ('Z1','X1')
输出:
cola colb
--------------
查询2:使用LEFT JOIN IS NULL和两个条件中ON子句
SELECT t1.*
FROM test1 t1
LEFT JOIN test2 t2
ON t1.cola = t2.cola AND t2.colc IN ('Z1','X1')
WHERE t2.cola IS NULL
输出:
cola colb
--------------
1 a
3 c
查询3:使用不在
SELECT t1.*
FROM test1 t1
WHERE t1.cola NOT IN (SELECT cola FROM test2 WHERE colc IN ('Z1','X1'))
输出:
cola colb
------------
1 a
3 c
问题:
- 有什么不对查询1?
- 如果我们有两个表中有多个条件,哪一个是真的?
- 哪一个最适合大数据检索? (2查询或查询3)
-
在第一个查询你有
WHERE t2.cola IS NULL和t2.colc IN( 'Z1', 'X1')
如果t2.cola为null,则t2.colc也将为空(所有字段将成为事实),它不能为空,有另一种价值,这就是为什么你没有得到结果
不知道在查询你问这里
,您将使用有更好的表现加入2
问题1:LEFT JOIN与T2和它的记录相结合T1的记录生产笛卡尔产品。您的问题是与Where
条件。
尝试执行没有WHERE
条件的查询,可以看到WHERE条件所在的结果集。
无论如何,查询运行正常。
Question2:LEFT JOIN条件中的过滤器不会过滤初始结果集。记录被合并,然后由WHERE子句过滤。
此外,查询运行正常。
没有一个错误或正确的查询,这取决于你想要查询该怎么办...
问题3:没有大数据检索的最佳选择。这两个查询都编码良好,但第二个更好。 SQL查询中大部分缺乏性能的原因是缺少JOIN中或WHERE条件中使用的字段中的索引。
您还可以在查询输出中包含执行计划以比较两个查询。 肯定查询2比查询3更好地工作
原因是:条件左连接或加入!=条件其中。 =>查询1 <>查询2 <>查询3
与查询1可以看到:
SELECT t1.*, t2.colc
FROM test1 t1
LEFT JOIN test2 t2
ON t1.cola = t2.cola
WHERE t2.cola IS NULL
否t2.colc IN( 'Z1', 'X 1')。
和
SELECT t1.*, t2.colc
FROM test1 t1
LEFT JOIN test2 t2
ON t1.cola = t2.cola
WHERE t2.colc IN ('Z1','X1');
没有t2.cola IS NULL
在查询2:如果您更改左连接加入=>查询2 =查询1
香面包车VIT伤心:左加入不等于在哪里 –