我有以下查詢:
SELECT first_name, age
FROM taba
WHERE NOT EXISTS
(
SELECT p.first_name, MAX(p.age) as age FROM taba p
GROUP BY p.first_name
);
內部子查詢查找給定名稱的最大年齡。我想基本上找到不在內部子查詢結果中的每一行。實作這一目標的最佳方法是什么?這個查詢給了我一個空集,我不知道為什么。
名字的最大年齡

所有資料

我希望所有資料中的所有資料都不是按名字查詢的最大年齡。
uj5u.com熱心網友回復:
使用相關子查詢...
SELECT
*
FROM
taba T
WHERE
age < (
SELECT MAX(age)
FROM taba P
WHERE T.first_name = P.first_name
)
使用子查詢和連接...
SELECT
t.*
FROM
taba t
INNER JOIN
(
SELECT first_name, MAX(age) AS max_age
FROM taba
GROUP BY first_name
)
AS age
ON age.first_name = t.first_name
AND age.max_age > t.age
使用EXECPT...
SELECT first_name, age FROM taba
EXCEPT
SELECT first_name, MAX(age) FROM taba GROUP BY first_name
使用EXISTS() (使用相關子查詢) ...
SELECT
*
FROM
taba T
WHERE
EXISTS (
SELECT *
FROM taba P
WHERE P.first_name = T.first_name
AND P.age > T.age
)
uj5u.com熱心網友回復:
您需要在內部查詢中參考外部表才能使此查詢正常作業。
SELECT first_name, age
FROM taba T
WHERE NOT EXISTS(SELECT NULL
FROM taba P
WHERE T.first_name = P.first_name
AND T.age = (SELECT MAX(age)
FROM taba P2
WHERE P.first_name = P2.first_name)
GROUP BY p.first_name
);
您也可以嘗試以下較短的版本 -
SELECT first_name, age
FROM (SELECT first_name, age, RANK() OVER(PARTITION BY first_name ORDER BY age DESC) RNK
FROM taba)
WHERE RNK <> 1;
uj5u.com熱心網友回復:
小提琴
還有另一種解決方案至少需要注意。
這避免了相關子查詢并且不需要連接。
一個常見的解決方案:
SELECT *
FROM taba
WHERE (first_name, age) NOT IN (
SELECT first_name, MAX(age)
FROM taba
GROUP BY first_name
)
;
uj5u.com熱心網友回復:
一個版本可以是:
SELECT b.first_name, b.age
FROM taba b
WHERE b.age < (SELECT Max(p.age)
FROM taba
WHERE p.first_name = b.first_name)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321571.html
標籤:sql PostgreSQL
上一篇:如何在postgresql中的一列中的所有行上應用翻譯函式
下一篇:postgres中的模式和觸發器
