写查询以仅找到那些等级高于所有纽约城市客户的客户
SELECT *
FROM customer
WHERE grade > ALL
(SELECT grade
FROM customer
WHERE city='New York');
答案 0 :(得分:2)
您可以在子查询中改为使用MAX
:
SELECT *
FROM customer
WHERE grade >
(SELECT MAX(grade)
FROM customer
WHERE city='New York');
正如@GordonLinoff指出的,如果New York
中没有客户,则此查询将失败。您可以通过使用COALESCE
将MAX
的值从NULL
转换为-1
来解决此问题(基本上,您需要一个小于{{ 1}})例如
grade
答案 1 :(得分:1)
您可以使用max():
SELECT * FROM customer WHERE grade > (SELECT max(grade) FROM customer WHERE city='New York')
请注意,这不会选择“纽约”的任何客户,只会选择其他城市的客户。
答案 2 :(得分:1)
改为使用max
。如果将grade
和city
一起索引,这将非常快。
SELECT *
FROM customer
WHERE grade > (
SELECT max(grade)
FROM customer
WHERE city='New York'
);
答案 3 :(得分:1)
您必须对此非常小心。很容易写:
SELECT *
FROM customer c
WHERE grade > (SELECT MAX(c2.grade)
FROM customer c2
WHERE c2.city = 'New York'
);
但是,如果纽约没有客户,则不会返回任何行。但是ALL
版本-问题的陈述-建议应返还 all 个客户。
最简单的解决方案是COALESCE()
,例如:
SELECT c.*
FROM customer c
WHERE grade > (SELECT COALESCE(MAX(c2.grade), c.grade - 1)
FROM customer c2
WHERE c2.city = 'New York'
);
或者,您可以使用窗口功能:
select c.*
from (select c.*,
max(case when c.city = 'New York' then c.grade end) as ny_grade
from customer c
) c
where grade > ny_grade or ny_grade is null;