2012-08-06 101 views
1

我想知道如果有人能幫我理解這段代碼在做什麼。我插入了一個SQL腳本,我試圖更新代碼,以便閱讀。我已經看過下面的代碼,它似乎有一個更簡單的方法來做到這一點,但我不能把我的頭圍繞着這個代碼實際上在做什麼。任何人都可以幫我描述一下這段代碼嗎? (也許給我介紹到如何使用子查詢或存在,或讀這更簡單的方法做到這一點?令人困惑的SQL Server代碼

SELECT DISTINCT 
    s.id 
    ,f.FLAG1 
    ,f.FLAG1 
    ,f.FLAG1 
INTO #DLK_TEMP 
from Inner_Source D 
    LEFT OUTER JOIN Outer_Source_1 S on D.au = S.AU 
     AND D.wcv_entity_key = S.wcv_entity_key 
    LEFT OUTER JOIN Outer_Source_2 F on S.id = F.id 
WHERE S.id IS NOT NULL 
+1

它工作嗎?是?不要碰它然後 – podiluska 2012-08-06 13:44:57

+0

他想明白它在做什麼。 – MoonKnight 2012-08-06 13:48:22

+2

WHERE S.id'在WHERE子句中沒有任何意義。這會將您的第一個外部聯接轉換爲內部聯接。 – 2012-08-06 13:49:46

回答

2

似乎很奇怪,它的上S執行LEFT OUTER JOIN,然後那些聯接成功行測試。這應該是一個INNER JOIN來代替。如果S.ID不能爲空,那麼你還可以刪除WHERE條款。

SELECT DISTINCT 
    s.id 
    ,f.FLAG1 
    ,f.FLAG1 
    ,f.FLAG1 
INTO #DLK_TEMP 
FROM Inner_Source AS D 
JOIN Outer_Source_1 AS S 
    ON D.au = S.AU 
    AND D.wcv_entity_key = S.wcv_entity_key 
LEFT OUTER JOIN Outer_Source_2 AS F 
ON S.id = F.id 

如果你喜歡,你可以改變第一個加入到EXISTS條款作出明確表示,加入只是充當過濾器:

SELECT DISTINCT 
    s.id 
    ,f.FLAG1 
    ,f.FLAG1 
    ,f.FLAG1 
INTO #DLK_TEMP 
FROM Outer_Source_1 AS S 
LEFT OUTER JOIN Outer_Source_2 AS F ON S.id = F.id 
WHERE EXISTS 
(
    SELECT * 
    FROM Inner_Source AS D 
    WHERE D.au = S.AU 
    AND D.wcv_entity_key = S.wcv_entity_key 
) 
+0

由於您正在重構它,不妨刪除三重'FLAG1'字段。 – Blindy 2012-08-06 13:49:06

+0

你們真棒。我只是無法包裹我的頭圍繞着2個外部連接,沒有任何列正被內部連接到... 非常感謝Mark! – DaveKelley 2012-08-06 14:14:59

0
INTO #DLK_TEMP 

是要插入一個雙激動人心的臨時表(當連接被關閉破壞)外連接成。

0

連接比子查詢中幾乎所有的情況下更好因爲你告訴優化器具體加入哪些字段。子查詢可以由優化器更改爲在某些情況下加入,在這種情況下您可以獲得相同的性能,但在其他情況下,它將是未索引的O(n^2)搜索。

至於什麼特別呢,它加入Inner_SourceOuter_Source_1Outer_Source_2(外專連接,這意味着你即使加入字段在某些表缺少的行(雖然第一次參加是相當多的內連接..))並從結果數據集中插入幾個字段到臨時表#DLK_TEMP

您應該閱讀連接,因爲它們是數據庫設計和編程的主要組件。你的這個問題真的很基本。

0

這是選擇所有不同的值(s.idf.FLAG1f.FLAG1f.FLAG1組合是不同的)到一個臨時表稱爲#DLK_TEMP。它正在獲得的數據(即s.id,f.FLAG1,f.FLAG1,f.FLAG1)來自三個不同的表格,這些表格包含唯一密鑰(Inner_Source,Outer_Source_1,Outer_Source_2)。這裏的左連接提供了對連接語句左側的值的優先順序。

注意,即使第二個(右)表中的記錄沒有匹配的值,左外連接也包括來自兩個表中第一個(左)的所有記錄。

我希望這會有所幫助。