2013-03-28 46 views
4

我的老闆以我的方式拋出了這段代碼,我很難理解內部連接的最後ON語句是如何工作的。我不認爲他完全理解它(但它完成了這項工作)。真的只是想了解更多關於SQL如何工作的知識。非常感謝!>,<, <>,=內部連接條件的運算符

這裏是在聲明

and (A.Submitted_Date > X.Submitted_Date))) 

這裏是查詢

SELECT AA.ID, AA.Submitted_Date as Date_Status  
    FROM Report as AA 
    where AA.Submitted_Date in 
    --START 
     (
     SELECT X.Submitted_Date 
     FROM Report as A 
     inner join 
     --Start Find All Dates Submitted 
     (
     SELECT [ID],[Submitted_Date] 
     FROM Report 
      where not(Submitted_Date is null and Cleared_Date is null) 
      group by ID, Submitted_Date) as X 
     --End Find all Dates Submittd 
    --below is the conditions of the join 


    ON A.ID = X.ID 
    and A.ID= AA.ID 

    --THIS IS THE CONDITION I AM CONFUSED ABOUT!!!! 
    and (A.Submitted_Date > X.Submitted_Date))) 

    group by X.Submitted_Date) 

    and not AA.Submitted_Date is null 
    group by AA.ID, AA.Submitted_Date 

下面是日期的樣品從表A

2012-11-27 00:00:00.000 
2012-11-27 00:00:00.000 
2012-11-27 00:00:00.000 
2012-12-10 00:00:00.000 
2012-11-27 00:00:00.000 
2012-11-27 00:00:00.000 
2012-11-29 00:00:00.000 
2012-12-05 00:00:00.000 
2012-12-12 00:00:00.000 

下面是日期的樣本來自表X

2012-11-27 00:00:00.000 
2012-11-29 00:00:00.000 
2012-12-05 00:00:00.000 
2012-12-10 00:00:00.000 
2012-12-12 00:00:00.000 

這裏是之前的最後一個條件

2012-11-27 00:00:00.000 
2012-11-29 00:00:00.000 
2012-12-05 00:00:00.000 
2012-12-10 00:00:00.000 
2012-12-12 00:00:00.000 

的結果這裏是A.Sub結果> X.Sub

2012-11-27 00:00:00.000 
2012-11-29 00:00:00.000 
2012-12-05 00:00:00.000 
2012-12-10 00:00:00.000 

我爲什麼這些日期出現混亂。 A和X之間正在進行什麼比較? A中的值不會總是與X相同,因此導致沒有最終的數據?感謝您的幫助!

+0

恕我直言,它會更清楚,如果這種情況是在WHERE子句。但是,我不確定執行計劃是否相同。 –

+0

我認爲我們需要更多地瞭解您的報告表以完全回答這個問題。你能否更新你的問題,以便X和A的樣本數據也有Report.ID。我對發生了什麼有了一個概念,但是我不能說沒有看到ID,因爲它們是連接條件的一部分。 – Fodagus

+0

生成的數據來自一個ID。所以把這個結果集想象成在底部有一個where語句,其中id ='111';感謝您試圖幫助! –

回答

2

連接條件做了兩件事。首先,確保x.Submitted_Date不爲空。這種情況直接違背了它上面的whre聲明。在該陳述中,如果Cleared_Date不爲空,Submitted_Date可能爲NULL。

非空的檢查僅僅是被使用。連接是內連接,因此只保留匹配的xa中的行。當x.Submitted_Date is null時,比較A.Submitted_Date > X.Submitted_Date的計算結果爲FALSE(實際上爲NULL,但在此上下文中NULL等價於FALSE)。第二,確保後面的對於給定的idReport。這是通過相同的比較發生的:A.Submitted_Date > X.Submitted_Date是說在A中有一個比X更晚的記錄。條件對Submitted_Date的所有值都是正確的,但最大值除外。

因此,簡而言之,除了最新日期之外,條件將採用所有提交的日期值。

條件可等同於:

where AA.Submitted_Date <> (select MAX(x.Submitted_Date) from Report where x.id = AA.id) 

我說可能因爲Cleared_Date使得這個問題的。但是,我認爲他們是一樣的。只要x.Submitted_Date不爲NULL,就會滿足原始查詢中的where子句。清除的日期可能會帶來額外的行,但是這些行將會有空的提交日期。所以,它只能提交最大的提交日期。

我猜想邏輯再一次變得複雜了,這是一個「簡化」版本,可以進一步簡化。

+0

謝謝你的迴應戈登。請您詳細說明它是如何檢查以後是否有記錄?它如何確保x.submitted_date不爲空?我覺得我開始有一個更好的理解! –

+0

我明白它是如何擺脫最後的記錄。 –

+0

感謝您的解釋戈登!這使事情變得很清楚。我非常感謝你的幫助。 –

2

如果您的數據包含ID字段會更好。我認爲ID不是唯一的。此外,我懷疑你選擇的樣本並不理想以瞭解情況。

考慮到你對這個問題的這些限制,我覺得令你困惑的是A.ID = X.ID.這是什麼讓你認爲日期是相同的,因此應該沒有數據。

如果您有報告表:

1 2012-11-27 
1 2012-11-29 

然後交叉聯接創建:

1 2012-11-27 1 2012-11-27 
1 2012-11-27 1 2012-11-29 
1 2012-11-29 1 2012-11-27 
1 2012-11-29 1 2012-11-29 

其中通過標準A.ID = X.ID然後A.date> X.日期將返回

1 2012-11-29 1 2012-11-27 

編輯:刪除「記錄2012-11-27不應該是結果的一部分,根據樣本。」因爲正在採取的日期字段是從X,而不是從A.

+0

這有助於非常感謝Koriander!這是有道理的,他會選擇x.SubDate –

相關問題