如何在不使用ALL的情况下编写此代码?

时间:2019-10-15 23:20:15

标签: mysql sql

写查询以仅找到那些等级高于所有纽约城市客户的客户

SELECT *
FROM customer
WHERE grade > ALL
   (SELECT grade
    FROM customer
    WHERE city='New York');

4 个答案:

答案 0 :(得分:2)

您可以在子查询中改为使用MAX

SELECT *
FROM customer
WHERE grade > 
   (SELECT MAX(grade)
    FROM customer
    WHERE city='New York');

正如@GordonLinoff指出的,如果New York中没有客户,则此查询将失败。您可以通过使用COALESCEMAX的值从NULL转换为-1来解决此问题(基本上,您需要一个小于{{ 1}})例如

grade

Demo on dbfiddle

答案 1 :(得分:1)

您可以使用max()

SELECT * FROM customer WHERE grade > (SELECT max(grade) FROM customer WHERE city='New York')

请注意,这不会选择“纽约”的任何客户,只会选择其他城市的客户。

答案 2 :(得分:1)

改为使用max。如果将gradecity一起索引,这将非常快。

SELECT *
FROM customer
WHERE grade > (
  SELECT max(grade)
  FROM customer
  WHERE city='New York'
);

dbfiddle

答案 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;