2012-03-01 84 views
0

這有點棘手,但我會盡我所能。如何將每個獨特記錄(基於2列)與另一個表中的每條記錄結合起來

說我有兩個表:

Dates(DateColumn日期時間)

SomeData(ID1 INT,ID2 INT,SomeDate日期時間)


Dates始終包含下列日期:

1/1/2012 
1/2/2012 
1/3/2012 

SomeData包含類似這樣的數據:

ID ID1 ID2 SomeDate 
1 1 4 1/1/2012 
2 1 4 1/2/2012 
3 2 3 1/1/2012 
4 2 3 1/3/2012 
6 5 1 1/2/2012 

現在,請注意如何在SomeData,一些行具有相同的ID1和ID2的組合。另請注意,其中有些人如何遺漏Dates表中的某些日期。我需要在Dates表中以某種方式加入每個組合的每個日期,以查找缺失的日期。

於是就加入,數據最終會看起來像這樣:

ID  ID1 ID2 SomeDate 
1  1 4 1/1/2012 
2  1 4 1/2/2012 
NULL 1 4 1/3/2012 <-- missing from SomeData table 

3  2 3 1/1/2012 
NULL 2 3 1/2/2012 <-- missing from SomeData table 
4  2 3 1/3/2012 

NULL 5 1 1/1/2012 <-- missing from SomeData table 
6  5 1 1/2/2012 
NULL 5 1 1/3/2012 <-- missing from SomeData table 

通知了每個ID1 + ID2組合中的每個返回3條記錄,使用在Dates表中所有的日期,並通知了每個「缺失」記錄保持ID1 + ID2組合。任何想法如何我可以把它關閉?

在此先感謝!

回答

1

CROSS JOIN是你的朋友在這裏。這是一個完整的樣例

DECLARE @Dates TABLE (DateColumn DATETIME) 
INSERT @Dates VALUES ('20120101'), ('20120102'), ('20120103') 

DECLARE @SomeData TABLE (ID INTEGER IDENTITY(1,1), ID1 INTEGER, ID2 INTEGER, 
    SomeDate DATETIME) 
INSERT @SomeData VALUES (1,4,'20120101'),(1,4,'20120102'),(2,3,'20120101'), 
    (2,3,'20120103'), (5,1,'20120102') 


SELECT sd2.ID, sd1.ID1, sd1.ID2, d.DateColumn 
FROM 
(
    SELECT ID1, ID2 
    FROM @SomeData 
    GROUP BY ID1, ID2 
) sd1 
    CROSS JOIN @Dates d 
    LEFT JOIN @SomeData sd2 ON sd1.ID1 = sd2.ID1 
      AND sd1.ID2 = sd2.ID2 
      AND sd2.SomeDate = d.DateColumn 

因此,要打破它:

  1. 「SD1」子查詢得到一組不同的所有ID1和ID2組合
  2. 然後,這是CROSS APPLY'd到日期表。這樣做的結果是,對於每個ID1 + ID2組合,它將導致在日期表中返回每個日期的行
  3. 最後的LEFT JOIN然後嘗試匹配ID1 + ID2 +返回日期ID值。如果找不到匹配,則返回NULL作爲ID;如果找到匹配,則返回ID。
+0

非常感謝。不知道交叉連接。細分也很有幫助。 – user1003916 2012-03-01 20:50:00

3
SELECT 
    sd.ID, 
    ids.ID1, 
    ids.ID2, 
    d.DateColumn AS SomeDate 
FROM 
(
    SELECT DISTINCT ID1, ID2 
    FROM SomeData 
) ids CROSS JOIN 
Dates d LEFT JOIN 
SomeData sd 
    ON sd.ID1 = ids.ID1 
    AND sd.ID2 = ids.ID2 
    AND sd.SomeDate = d.DateColumn 
+0

非常感謝,我不知道交叉連接。 – user1003916 2012-03-01 20:49:36

相關問題