Sql server 不在不存在

Sql server 不在不存在,sql-server,select,Sql Server,Select,我有三张桌子 table1 -> xt1, yt1, zt1; table2 -> xt2 table3 -> yt3, zt3 SELECT xt1, yt1, zt1 From table1, table3 Where xt1 NOT IN (SELECT DISTINCT table1.xt1 FROM table2 INNER JOIN table1 ON table1.xt1 = Replace(table2.xt2,',',''))

我有三张桌子

table1 -> xt1, yt1, zt1;
table2 -> xt2
table3 -> yt3, zt3


SELECT xt1, yt1, zt1  
From table1, table3 
Where  xt1
NOT IN
   (SELECT  DISTINCT table1.xt1 FROM table2 INNER JOIN table1 ON 
    table1.xt1 = Replace(table2.xt2,',','')) 
And table1.yt1 = table3.yt3
AND table1.zt1 = table3.zt3
它工作正常,但我花了很长时间。 如果我用NOT exists替换NOT IN,它将返回空集

SELECT xt1, yt1, zt1  
From table1, table3 
Where  Not exists 
(SELECT  DISTINCT table1.xt1 FROM table2 INNER JOIN table1 ON 
    table1.xt1 = Replace(table2.xt2,',','')) 
And table1.yt1 = table3.yt3
AND table1.zt1 = table3.zt3
第二个select的结果应该是6行,但它返回notiong with not exists

如果我尝试将比较部分更改为 表1.xt1!=替换table2.xt2,,,并删除不在 选择它以获取内存不足错误

那么,这是编写查询的最佳方法吗?为什么它返回空集而不存在
谢谢。

您需要根据内部查询的大小选择IN或exist。当存在外部查询和内部子查询时,如果子查询的结果较小,则首选In,因为根据子查询的结果选择外部查询。
如果子查询的结果很大,则首选exist,因为首先计算外部查询。

好的,首先,我将隐式连接更改为显式连接。然后,我修复了“不存在”,使其与外部表1相关:

可进一步简化为:

SELECT t1.xt1, t1.yt1, t1.zt1  
FROM table1 AS t1
INNER JOIN table3 AS t3
    ON t1.yt1 = t3.yt3
    AND t1.zt1 = t3.zt3
WHERE NOT EXISTS (  SELECT 1
                    FROM table2 AS t2
                    WHERE t1.xt1 = REPLACE(t2.xt2,',','')
                 ) ;

表3在您的查询中的什么位置?最后两个and和它在from中对不起,请同时发布您的NOT EXISTS查询。如果它没有返回结果,您只是错误地实现了它。@user2320492我知道,我看到了这些,但是在FROM中没有表3,也没有联接,所以…从表1中选择t1,从表3中选择t3(不存在),从表1.xt1=Replacetable2.xt2','和表1.xt1=t1.xt1上的表2内部联接表1中选择*。。。。或者更简单地说:从表1中选择t1,从表3中选择t3,其中t1.xt1=Replacetable2.xt2',',',…此查询从表2中选择不同的表1.xt1,在表1.xt1=Replacetable2.xt2',',',只返回6行,但表很大。谢谢。当我使用DISTINCT关键字时,我工作得很好,但没有它,它给出的时间与我使用的时间相同。但是真的很感谢,但是如果你有时间,我有两个问题:第一,你写的两个查询是相同的吗?第二种方法“如何知道不存在”是正确的,我的意思是我没有得到“选择1”,您可以提供一些资源来阅读吗?我注意到第二种方法比第一种方法慢得多。根据效率,如果您编辑了问题并添加了创建表脚本、索引以及实际的执行计划,这将是一件好事。表中可能缺少某些索引或数据类型不匹配。
SELECT t1.xt1, t1.yt1, t1.zt1  
FROM table1 AS t1
INNER JOIN table3 AS t3
    ON t1.yt1 = t3.yt3
    AND t1.zt1 = t3.zt3
WHERE NOT EXISTS (  SELECT 1
                    FROM table2 AS t2
                    WHERE t1.xt1 = REPLACE(t2.xt2,',','')
                 ) ;