如何在下面的1个查询中选择。此查询需要重新搜索,以便为自己的循环找到值。
这与其他子查询不同,仅使用1个表
TAble T
| num| WHOSE
| 1 | A
| 1 | C
| 2 | B
| 2 | C
| 3 | D
匹配记录(条件)的标准:
我想在 num 列中找到值3的记录(对于列的,其中有D)。
select * from T where whose <> C and ( num is not one of c's)
1 A不能,因为C有1
2 B不能因为C有2
3 D是我想要的,因为它列中的 C 并且在 num 列中共享一个值 列中 C 的记录。
答案 0 :(得分:0)
首先选择num
为whose
的记录C
。然后选择那些whose
不是C
的记录,以及num
不是子查询中的那些记录。
Select * from T where whose <> 'C' and num not in (Select Num from T where whose = 'C' )
答案 1 :(得分:0)
获得相同结果的另一种方法是在同一个表上使用LEFT JOIN:
SELECT T.*
FROM T
LEFT JOIN T t2 on t2.num = T.num and t2.whose = 'C'
WHERE T.whose <> 'C' AND t2.whose IS NULL
在this SQL Fiddle上查看结果为:
| num | whose |
| 3 | D |
此外,编写查询的类似方法是使用 WHERE 条件中的NOT EXISTS子句,如下所示:
SELECT T.* from T
WHERE T.whose <> 'C' AND NOT EXISTS (SELECT 1 FROM T t2 WHERE
t2.num = T.num AND t2.whose = 'C')
在this SQL fiddle中查看。
要了解有关EXISTS和LEFT JOIN之间比较的更多信息,请参阅this article。在最后的摘要中,它得出以下结论:
MySQL可以优化所有三种方法来做一种NESTED LOOPS ANTI JOIN。 ... 但是,这三种方法生成三个不同的计划,这三个计划由三个不同的代码执行。执行 EXISTS 谓词的代码 30%的效率低于执行index_subquery和LEFT JOIN优化使用Not exists方法的代码。
这就是为什么在 MySQL 中搜索缺失值的最佳方法是使用 LEFT JOIN / IS NULL 或 NOT IN 而不是 NOT EXISTS 。