2

我在t-sql中寫了一個查詢,它在子查詢中使用了一個函數,並且遇到了兩個問題。如下t-sql中的子查詢Where子句是否查詢每行的數據?

AdID- Name 

的選項表:如下 想象一個廣告表

OptionID - OptionName 

而這兩個有兩個外鍵列之間的垃圾表(AdvertisementOptionLink):

AdID - OptionID 

現在我想在用戶選擇選項時查詢廣告。 我寫了一個這樣的查詢:

SELECT * FROM Advertisement ad 
INNER JOIN AdvertisementOptionLink aol 
WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements) 

現在UDF_GetAdvertisements是表值函數,返回的廣告列表有特定選項。

有兩個問題:

  1. 這是UDF_GetAdvertisements功能查詢所有數據的每一行?我的意思是,如果我在我的桌子上有2000個廣告,是否會查詢所有這些廣告並返回所有廣告ID?我最好將函數返回值保存在變量中嗎?

2.在這個數據庫中有一些沒有任何選項的廣告如果用戶沒有選擇任何選項,我該如何返回所有廣告?

在t-sql中使用表值參數來通過存儲過程傳遞選定的選項ID。 使用本頁有些幫助:http://www.sommarskog.se/arrays-in-sql-2008.html

+1

每個問題請提出一個問題。 –

+0

@MartinSmith OK讓我們堅持第一個;) – Ashkan

回答

2

您需要檢查執行計劃。

WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements) 

將作爲邏輯semi join運算符來實現。物理連接類型可以是任何合併,散列或嵌套循環。

合併連接和散列連接一次處理每個輸入。嵌套循環處理外部輸入一次,內部循環多次處理外部輸入中的行。但即使TVF顯示在嵌套循環連接的內側,結果也可能被緩存在假脫機緩衝區中,而不是反覆重新評估TVF。

+0

Thiks我認爲OUTER APPLY是對我的兩個問題的答案。 – Ashkan