Oracle

此別名指的是哪一列?

  • August 13, 2015

我已經閱讀了以下程式碼幾次,試圖弄清楚它在做什麼。

“右外連接是將右表中不匹配的行與左表中的匹配行返回。”

好的,但是"item_cnt"表中不存在該列,那麼它作為別名的列是什麼?我正在為 1z0-047 做準備,因此我們將不勝感激。


您執行了以下查詢以顯示PRODUCT_NAME產品的訂購次數和次數:

SELECT p.product_name, i.item_cnt
FROM (SELECT product_id, COUNT (*) item_cnt
FROM order_items
GROUP BY product_id) i RIGHT OUTER JOIN products p ON i.product_id = p.product_id;

我認為該列應該存在。但這裡是包含所有範例模式的 Oracle 文件頁面。如果我用 ctrl+f 搜尋item_cnt,我什麼也找不到:Oracle example schemas

好的,但是"item_cnt"表中不存在該列,那麼它作為別名的列是什麼?

該列item_cnt可能不存在於基表中(我們相信你,我們沒有去搜尋連結的文件。)

但是這部分程式碼:

FROM 
    (SELECT product_id, COUNT (*) item_cnt
     FROM order_items
     GROUP BY product_id) i

提供了一個派生表。該列在查詢執行期間存在於派生表中i。定義了(SELECT product_id, ... item_cnt ...) AS i一個派生表,它命名它i並且這個派生表有兩列,product_id並且item_cnt(並且item_cnt是表達式的別名COUNT(*)。在任何表中都沒有 count(*) 列!)

因此,稍後在程式碼中,您可以使用它們。i.product_id用於ON條件和i.item_cnt列表SELECT中。

(而且它似乎更早出現而不是更晚出現,這有點令人困惑。那是因為SELECT查詢的一部分在邏輯上是在該FROM部分之後執行的。)

FROM (...) i RIGHT OUTER JOIN products p ON ... 

對於查詢執行,兩個表(aliasedip)沒有區別。一個是基表而另一個是派生表並不重要。它們可以以相同的方式使用。(據我們所知,它products也可能不是基表。它很可能是一個查看的表,通常稱為視圖。)

引用自:https://dba.stackexchange.com/questions/73100