我目前正在學習 Oracle 上的 SQL,我的模塊中給出的示例之一相當令人費解,主要是因為實際上沒有給出任何解釋。我確信它是相當基本的,但它使用關鍵字“TOTAL ON”作為其中的一部分,我真的不知道這意味著什么或這個連接實際發生了什么。
我嘗試尋找解決方案,但可以理解的是,使用“TOTAL”這個詞會在 SUM 聚合函式上顯示一些內容。
這是宣告:
SELECT CUSTOMER.*, TotalPurchased
FROM CUSTOMER
JOIN
(
SELECT CustomerID, SUM(PurchasedAmount) AS TotalPurchased
FROM PURCHASE
GROUP BY CustomerID;
) TOTAL ON TOTAL.CustomerID = CUSTOMER.CustomerID;
誰能告訴我這是什么?先感謝您。
uj5u.com熱心網友回復:
TOTAL是子查詢的別名,ON是指定連接表的條件的子句的開頭。
您可以將查詢重寫為:
SELECT table_alias.*,
subquery_alias.TotalPurchased
FROM CUSTOMER table_alias
JOIN (
SELECT CustomerID, SUM(PurchasedAmount) AS TotalPurchased
FROM PURCHASE
GROUP BY CustomerID -- No ; here.
) subquery_alias
ON subquery_alias.CustomerID = table_alias.CustomerID;
我想為了有一個名字來加入那個子查詢,那么需要別名嗎?
別名有助于闡明哪個列屬于哪個表,但在 Oracle 中,如果列是唯一的,則不需要。
注意:一些 RDBMS 要求每個子查詢都有一個別名;然而,甲骨文沒有。
例如:
SELECT dual.*,
id
FROM DUAL
JOIN ( SELECT DUMMY AS id FROM DUAL )
ON id = dummy;
輸出:
假 ID X X
因為哪個表包含哪個列是明確的。
但是使用:
SELECT *
FROM DUAL
JOIN DUAL
ON dummy = dummy;
或者
SELECT *
FROM DUAL
JOIN (SELECT DUMMY FROM DUAL)
ON dummy = dummy;
兩者都引發了例外:
ORA-00918: column ambiguously defined
由于該ON子句無法區分dummy列所指的表/子查詢,因為兩者都使用了相同的識別符號。
在任何一種情況下,您都可以通過給子查詢一個別名(也可能是表一個別名)來修復例外,然后在列識別符號前面加上表名或別名來澄清哪個是哪個。
db<>在這里擺弄
uj5u.com熱心網友回復:
TOTAL只是括號內嵌套表的別名。也許重新格式化會更有意義:
SELECT CUSTOMER.*, TotalPurchased
FROM CUSTOMER
JOIN (
SELECT CustomerID, SUM(PurchasedAmount) AS TotalPurchased
FROM PURCHASE
GROUP BY CustomerID
) AS TOTAL
ON TOTAL.CustomerID = CUSTOMER.CustomerID
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/482542.html
