不存在于同一个表中

Ron*_*nny 10 sql

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

SELECT test_name
FROM tests 
WHERE version='ie7' 
AND NOT EXISTS (SELECT test_name FROM tests where version='ie8');
Run Code Online (Sandbox Code Playgroud)

谢谢!

Spi*_*man 12

你可能意味着:

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');
Run Code Online (Sandbox Code Playgroud)

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


小智 9

试试这个

SELECT test_name
FROM tests 
WHERE version='ie7' 
AND test_name  NOT In (SELECT test_name FROM tests where version='ie8');
Run Code Online (Sandbox Code Playgroud)


And*_*ndy 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
Run Code Online (Sandbox Code Playgroud)

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

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


Ada*_*Dev 5

您在子查询上缺少匹配行以匹配外部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');
Run Code Online (Sandbox Code Playgroud)