我想选择在IE7上运行但不在IE8上运行的测试。我试过这个,但我得到0,这不是真的。
SELECT test_name
FROM tests
WHERE version='ie7'
AND NOT EXISTS (SELECT test_name FROM tests where version='ie8');
谢谢!
答案 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';