查询中有什么错误

insrf1ej  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(198)
SELECT *
FROM
(
    SELECT emplname, length(emplname) AS m
    FROM employeesinfo
) as k
where m = (select max(m) from k);

这段代码有什么问题?它显示表不存在错误1146

irlmq6kh

irlmq6kh1#

我将你的语法改为:

SELECT emplname, LENGTH(emplname) AS name_length
FROM employeesinfo
WHERE LENGTH(emplname) = (SELECT MAX(LENGTH(emplname)) FROM employeesinfo);

另一种通用的方法是使用 RANK 分析函数:

WITH cte AS (
    SELECT emplname, LENGTH(emplname) AS name_length,
           RANK() OVER (ORDER BY LENGTH(emplname) DESC) rnk
    FROM employeesinfo
)

SELECT emplname, name_length
FROM cte
WHERE rnk = 1;

如果您只需要一个最大长度的记录,那么在mysql上我们可以使用 LIMIT :

SELECT emplname, LENGTH(emplname) AS name_length
FROM employeesinfo
ORDER BY LENGTH(emplname) DESC
LIMIT 1;
svmlkihl

svmlkihl2#

table k 不引用此查询中的派生表:

SELECT k.*
FROM ( SELECT emplname, length(emplname) as m FROM employeesinfo
     ) k 
WHERE m = (SELECT max(m) FROM k);

您可能会混淆子查询和CTE。如果您将其定义为cte,那么它将起作用:

WITH k as (
      SELECT emplname, length(emplname) as m
      FROM employeesinfo
     )
SELECT k.*
FROM k
WHERE m = (SELECT MAX(m) FROM k);

我应该注意到也许有更好的方法来处理这个问题。例如,如果只需要一个最大值,则可以使用:

select k.*
from k
order by length(emplname) desc
fetch first 1 row only;

相关问题