我在理解內部子查詢(即引用外部子查詢)時,如何在爲外部查詢中的每一行返回一組集合時發生問題。我知道它做了什麼,但不知道它是如何做到的。相關子查詢如何通過外部子查詢「循環」?
現在,我將它作爲一個「嵌套循環」(來自程序員背景,但從未與數據庫一起工作)。但是我按照循序漸進的邏輯遇到困難。
在任何一種編程語言的典型'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將要保存的值。
對於外部查詢中的每一行(這是'P1'的位置),'P1.categoryid'只能有一個值。因此子查詢僅檢查'p2'(子查詢中的Products表)中的那些行,其中'categoryid'與正在處理的外部查詢中的單行的'categoryid'相同。它與加入時的完全一樣。查詢處理器如何將兩組記錄合併到查詢處理器中。有幾種不同的合併技術可用。 –
好吧,它對我來說有點意義,但我仍然處於陰霾中。 請參閱當您使用JOIN並指定ON子句來說 't1.ID = t2.ID' 對我來說它是有道理的,因爲你有一個專用的ON子句(匹配行和一個特殊的JOIN關鍵字)。 但是有了兩個SELECT語句,其中一個是嵌套的,那麼如何模擬這種行爲呢? – starbyone
也許閱讀[邏輯查詢處理](http://sqlmag.com/sql-server/logical-query-processing-what-it-and-what-it-means-you),它解釋了部分語句被處理,將有所幫助。或者它可能會導致你的[大腦試圖逃脫](http://dilbert.com/strip/2016-11-30)。 – HABO