我在一個相當長的查詢,在某些時候,我有這樣的:內部查詢JOIN
LEFT OUTER JOIN T1 ON T1.ID = T2.ID
自從我得到不正確的結果從我的查詢(太多行),我正在工作對此,當我試過這個:
LEFT OUTER JOIN (SELECT * FROM T1) T1 ON T1.ID = T2.ID
然後得到我想要的。我想知道爲什麼這兩行有不同的結果。有人可以向我解釋嗎?
P.S.我使用SQL Server 2008.
編輯2:我發佈了一個video on YouTube顯示問題。
編輯1:這裏是顯示問題的完整最小查詢:
SELECT
Project.ProjectID,
Contract.ContractID,
BookletStatus.PrintStatusID AS StatusID
FROM
Project
INNER JOIN Contract ON Contract.ContractID = Project.SignedContractID
INNER JOIN BookProject ON BookProject.ProjectID = Project.ProjectID
LEFT OUTER JOIN (SELECT * FROM Booklet) Booklet1 ON Booklet1.ContractID = Contract.ContractID
INNER JOIN PrintStatus AS CoverStatus ON BookProject.CoverStatusID = CoverStatus.PrintStatusID
INNER JOIN PrintStatus AS BookletStatus ON
(CASE
WHEN Booklet1.Qty > 0 THEN BookProject.BookletStatusID
ELSE -10
END) = BookletStatus.PrintStatusID
下面是結果,與內查詢 「(SELECT * FROM小冊子)Booklet1」:
ProjectID ContractID StatusID
501 1356 -10
502 1317 -10
503 1371 -10
...
而且結果沒有內部查詢(僅使用「小冊子Booklet1」):
ProjectID ContractID StatusID
501 1356 -10
501 1356 0
501 1356 10
501 1356 15
501 1356 20
...
502 1317 -10
502 1317 0
502 1317 10
502 1317 15
502 1317 20
...
503 1371 -10
503 1371 0
503 1371 10
503 1371 15
503 1371 20
...
可能不會得到太多的幫助,除非你能重現該問題與一個小而完整的查詢,並解釋你得到什麼樣的複製品。也許嘗試一個較小的查詢,只用前面的表'SELECT * FROM T2 LEFT OUTER JOIN T1 ...'來查看它是否演示了這個問題,然後查詢就會更小,並且可以發佈完整的查詢。 **如果您不能像這樣重現問題,那麼這表明查詢的其餘部分對您所看到的行爲有所貢獻,而不僅僅是您發佈的片段。** – AaronLS
出於好奇,它是否會使任何如果您將子查詢上的別名從T1更改爲T1_Derived,那麼區別如何? LEFT OUTER JOIN(SELECT * FROM T1)T1_Derived ON T1_Derived.TheID = T2.TheID。它不應該,但是在一個微不足道的差異中,我認爲它影響了實際的執行計劃。 –
@KarlKieninger我試過了,它沒有區別(我用一個別名或另一個獲得不同的行)。一些讓我撓頭的東西:我在SQL Server 2008的開發機器上得到了這些結果;但是當我在生產服務器上備份/恢復完整的數據庫時,運行SQL Server 2008 R2時,我總是獲得不同的行。換句話說,我的原始查詢(沒有內部查詢)在兩臺機器上的表現都不一樣。 – ConnorsFan