2017-10-12 142 views
0

我有以下表格,即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. 有什么不对查询1?
  2. 如果我们有两个表中有多个条件,哪一个是真的?
  3. 哪一个最适合大数据检索? (2查询或查询3)
+0

香面包车VIT伤心:左加入不等于在哪里 –

回答

2
  1. 在第一个查询你有

    WHERE t2.cola IS NULL和t2.colc IN( 'Z1', 'X1')

如果t2.cola为null,则t2.colc也将为空(所有字段将成为事实),它不能为空,有另一种价值,这就是为什么你没有得到结果

  • 不知道在查询你问这里

  • ,您将使用有更好的表现加入2

  • 1

    问题1:LEFT JOIN与T2和它的记录相结合T1的记录生产笛卡尔产品。您的问题是与Where条件。

    尝试执行没有WHERE条件的查询,可以看到WHERE条件所在的结果集。

    无论如何,查询运行正常。

    Question2:LEFT JOIN条件中的过滤器不会过滤初始结果集。记录被合并,然后由WHERE子句过滤。

    此外,查询运行正常。

    没有一个错误或正确的查询,这取决于你想要查询该怎么办...

    问题3:没有大数据检索的最佳选择。这两个查询都编码良好,但第二个更好。 SQL查询中大部分缺乏性能的原因是缺少JOIN中或WHERE条件中使用的字段中的索引。

    您还可以在查询输出中包含执行计划以比较两个查询。 肯定查询2比查询3更好地工作

    0

    原因是:条件左连接或加入!=条件其中。 =>查询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