2016-12-08 181 views
0

我在理解內部子查詢(即引用外部子查詢)時,如何在爲外部查詢中的每一行返回一組集合時發生問題。我知道它做了什麼,但不知道它是如何做到的。相關子查詢如何通過外部子查詢「循環」?

現在,我將它作爲一個「嵌套循環」(來自程序員背景,但從未與數據庫一起工作)。但是我按照循序漸進的邏輯遇到困難。

在任何一種編程語言的典型'for循環'中,我都明白外部循環會計數並執行嵌套的動作。這對我來說很有意義。但對於下面的tsql示例,我只是沒有看到爲什麼內部查詢將'運行'外部查詢中的每一行。還是甚至?

SELECT categoryid, productid, productname, unitprice 
FROM Production.Products AS P1 
WHERE unitprice = 
    (SELECT MIN(unitprice) 
    FROM Production.Products AS p2 
    WHERE P2.categoryid = P1.categoryid); 

立即根據來自此樣品從(使用TSQL2012數據庫)的相關性所採取的書是謂詞P2.categoryid = P1.categoryid。 而且我明白了,P1.category ID將循環遍歷categoryid中的所有行,並返回其中每個行的最小單位價格。

但在我看來,我不明白查詢如何確定P1.categoryid將要保存的值。

+0

對於外部查詢中的每一行(這是'P1'的位置),'P1.categoryid'只能有一個值。因此子查詢僅檢查'p2'(子查詢中的Products表)中的那些行,其中'categoryid'與正在處理的外部查詢中的單行的'categoryid'相同。它與加入時的完全一樣。查詢處理器如何將兩組記錄合併到查詢處理器中。有幾種不同的合併技術可用。 –

+0

好吧,它對我來說有點意義,但我仍然處於陰霾中。 請參閱當您使用JOIN並指定ON子句來說 't1.ID = t2.ID' 對我來說它是有道理的,因爲你有一個專用的ON子句(匹配行和一個特殊的JOIN關鍵字)。 但是有了兩個SELECT語句,其中一個是嵌套的,那麼如何模擬這種行爲呢? – starbyone

+0

也許閱讀[邏輯查詢處理](http://sqlmag.com/sql-server/logical-query-processing-what-it-and-what-it-means-you),它解釋了部分語句被處理,將有所幫助。或者它可能會導致你的[大腦試圖逃脫](http://dilbert.com/strip/2016-11-30)。 – HABO

回答

1

對於外部查詢中的每一行(即P1所在的位置),P1.categoryid只能有一個值。因此子查詢僅檢查p2中的行(子查詢中的Products表),其中categoryid與外部查詢中單行的分類id相同。它與加入時的完全一樣。查詢處理器如何合併兩組記錄取決於查詢處理器。有幾種不同的合併技術可用。

有效,因爲子查詢是在where子句中,它只是過濾結果集,以消除所有行單價爲最低單價的產品這一類。即它選擇每個類別中價格最低的產品[s]。