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,',','')
) ;