不存在于同一个表中

时间:2010-12-23 13:44:18

标签: sql

我想选择在IE7上运行但不在IE8上运行的测试。我试过这个,但我得到0,这不是真的。

SELECT test_name
FROM tests 
WHERE version='ie7' 
AND NOT EXISTS (SELECT test_name FROM tests where version='ie8');

谢谢!

5 个答案:

答案 0 :(得分:10)

你可能意味着:

SELECT test_name
FROM tests t1
WHERE version='ie7' 
AND NOT EXISTS (SELECT test_name FROM tests t2 where test_name = t1.test_name AND version='ie8');

(我的Transact-SQL有点生疏,但我认为这是如何完成的。重要的是你说“我想要所有test_names版本'ie7'并且数据库中不存在任何行所有版本'ie8'“:))

答案 1 :(得分:8)

这是正确查询的更佳形式:

 SELECT tests.test_name
 FROM tests
 LEFT JOIN tests AS tests2 ON tests.test_name = tests2.test_name
     AND tests2.version = 'ie8'
 WHERE tests.version = 'ie7' AND tests2.version IS NULL

你看我已经为test_name添加了一个比较检查,因为没有它,你说只有在没有ie8测试的情况下才能获得ie7的所有测试。

子查询的效率低于左连接,并且此IS NULL条件检查将产生相同的结果,并允许使用良好的索引进行更快的处理。

答案 2 :(得分:7)

试试这个

SELECT test_name
FROM tests 
WHERE version='ie7' 
AND test_name  NOT In (SELECT test_name FROM tests where version='ie8');

答案 3 :(得分:4)

您在子查询上缺少一个条件,以便将行与外部SELECT匹配,例如:

SELECT t.test_name
FROM tests t
WHERE t.version='ie7' 
    AND NOT EXISTS (
        SELECT test_name FROM tests where test_name=t.test_name AND version='ie8');

答案 4 :(得分:0)

   SELECT test_name
     FROM tests 
    WHERE version = 'ie7' 
   EXCEPT 
   SELECT test_name
     FROM tests 
    WHERE version = 'ie8';