CTE 和 SQL 中的子查詢的新手。
我有 3 張桌子:
categories (category_code, category)
countries (country_code, country, continent)
businesses (business, year_founded, category_code, country_code)
目標是研究世界上最古老的企業。我使用了 CTE:
WITH bus_cat_cont AS (
SELECT business, year_founded, category, country,
continent
FROM businesses AS b
INNER JOIN categories AS c1
ON b.category_code = c1.category_code
INNER JOIN countries AS c2
ON b.country_code = c2.country_code
)
SELECT continent,
category,
COUNT(business) AS n
FROM bus_cat_cont
WHERE n > 5
GROUP BY continent, category
ORDER BY n DESC;
該代碼無需WHERE n > 5. 但是在添加之后,我得到了錯誤:
column "n" does not exist
我意識到有一種更簡單的方法可以在沒有 CTE 的情況下獲得我想要的輸出。
但我想知道:為什么我會收到這個錯誤?
uj5u.com熱心網友回復:
這會起作用:
WITH bus_cat_cont AS (
SELECT business, year_founded, category, country, continent
FROM businesses AS b
JOIN categories AS c1 ON b.category_code = c1.category_code
JOIN countries AS c2 ON b.country_code = c2.country_code
)
SELECT continent, category, count(business) AS n
FROM bus_cat_cont
-- WHERE n > 5 -- wrong
GROUP BY continent, category
HAVING count(business) > 5 -- right
ORDER BY n DESC;
輸出列名稱“n”在WHEREorHAVING子句中(尚)不可見。考慮 SQL 查詢中的事件序列:
- 在應用 LIMIT 之前獲取結果計數的最佳方法
鄭重宣告,結果與您宣稱的“看看世界上最古老的企業”的目標沒有明顯的聯系。year_founded在查詢中未使用。
您可以獲得企業中最常見的大陸/類別組合。
除此之外,可能更好:
SELECT co.continent, ca.category, n
FROM (
SELECT category_code, country_code, count(*) AS n
FROM businesses
GROUP BY 1, 2
HAVING count(*) > 5
) b
JOIN categories ca USING (category_code)
JOIN countries co USING (country_code)
ORDER BY n DESC;
真的不需要CTE。
先聚合,后加入。看:
- 使用 LEFT JOIN 查詢不回傳計數為 0 的行
除了更快之外,這也更安全。雖然category_code,country_code應該被定義UNIQUE,但對于continentand可能不是這樣category。(您可能還需要輸出代碼以消除歧義。)
count(*)是單獨實作的,并且速度稍快 - 和等效的 whilebusiness是定義的NOT NULL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/438766.html
標籤:sql PostgreSQL 子查询 where子句 公共表表达式
上一篇:SQL,如果當前行中的columnA或以下的columnB有資料,如何獲取相同Id下的行
下一篇:從其他表中查找具有組值的行
