2012-11-14 47 views
0

這裏的問題是:結果的重複加入/ COALESCE

CREATE TABLE #datesX 
    (
    [Name] [varchar] (8) NULL 
    , [MarriedDate] datetime NULL 
    , [HappyScoreX] [int] NULL 
    ) 
INSERT INTO #datesX 
    values 
    ('TIM', null, 20), 
    ('RAJ', '01 jan 2012', 20), 
    ('PAUL', '01 jan 1960', 20) 


CREATE TABLE #datesY 
    (
    [Name] [varchar] (8) NULL 
    , [FirstSprogDate] datetime NULL 
    , [HappyScoreY] [int] NULL 
    ) 
INSERT INTO #datesY 
    values 
    ('TIM', '01 jan 1995', 20), 
    ('RAJ', '20 JUN 2013', 20), 
    ('JASE', null, 20), 
    ('PAUL', '01 jan 1970', 20) 


CREATE TABLE #datesZ 
    (
    [Name] [varchar] (8) NULL 
    , [FoundGodDate] datetime NULL 
    , [HappyScoreZ] [int] NULL 
    ) 
INSERT INTO #datesZ 
    values 
    ('TIM', null, 20), 
    ('RAJ', null, 20), 
    ('JASE', '01 DEC 2012', 20), 
    ('PAUL', '01 jan 1970', 20) 




SELECT 
     [Name] = COALESCE(x.Name, y.Name, z.Name), 
     x.[MarriedDate], 
     y.[FirstSprogDate], 
     z.[FoundGodDate], 
     [HappyScoreX] = SUM(ISNULL(x.[HappyScoreX],0.0)), 
     [HappyScoreY] = SUM(ISNULL(y.[HappyScoreY],0.0)), 
     [HappyScoreZ] = SUM(ISNULL(z.[HappyScoreZ],0.0)) 
FROM 
     #datesX x 
     FULL OUTER JOIN #datesY y ON 
       x.Name = y.Name 
     FULL OUTER JOIN #datesZ z ON 
       x.Name = z.Name 
GROUP BY 
     COALESCE(x.Name, y.Name, z.Name), 
     x.[MarriedDate], 
     y.[FirstSprogDate], 
     z.[FoundGodDate] 

我有點明白爲什麼爲JASE記錄正在被複制 - 我怎麼修改查詢,以便JASE只有一個記錄?

+0

而至極記錄?他們不是完全重複的 – Lamak

回答

3

嘗試,而不是這個連接:

FULL OUTER JOIN #datesY y ON 
     x.Name = y.Name 
FULL OUTER JOIN #datesZ z ON 
     coalesce(x.Name, y.name) = z.Name 
+0

優秀 - 同事剛給我看了同樣的答案;如此簡單,當你知道 – whytheq

1

您希望每個名稱有一行。我的建議是首先建立密鑰,然後獲取行。

CREATE TABLE #nameKeys 
(
    [Name] varchar(8) NOT NULL PRIMARY KEY 
) 

INSERT INTO #nameKeys ([Name]) 
SELECT DISTINCT [Name] FROM #datesX WHERE [Name] is not null 
UNION 
SELECT DISTINCT [Name] FROM #datesYY WHERE [Name] is not null 
UNION 
SELECT DISTINCT [Name] FROM #datesZ WHERE [Name] is not null 


--Then later... 

FROM 
    #nameKeys n 
    LEFT JOIN #datesX x ON n.[Name] = x.[Name] 
    LEFT JOIN #datesY y ON n.[Name] = y.[Name] 
    LEFT JOIN #datesZ z ON n.[Name] = z.[Name] 
+0

+1謝謝:這似乎比第一個解決方案更明確。 – whytheq

1

你有麻煩的是,你有兩個FULL OUTER JOINS上#datesX。由於JASE中沒有#datesX中的行,因此您有從Y和Z表返回行的行,但是您的上一個完整外層表明您應該將X.Name與Z.Name匹配。下面的代碼會得到你想要的東西(我認爲|)

SELECT 
     [Name] = COALESCE(x.Name, y.Name, z.Name), 
     x.[MarriedDate], 
     y.[FirstSprogDate], 
     z.[FoundGodDate], 
     [HappyScoreX] = SUM(ISNULL(x.[HappyScoreX],0.0)), 
     [HappyScoreY] = SUM(ISNULL(y.[HappyScoreY],0.0)), 
     [HappyScoreZ] = SUM(ISNULL(z.[HappyScoreZ],0.0)) 
FROM 
     #datesX x 
     FULL OUTER JOIN #datesY y ON 
       x.Name = y.Name 
     FULL OUTER JOIN #datesZ z ON 
       z.Name = COALESCE(x.Name, y.Name) 
GROUP BY 
     COALESCE(x.Name, y.Name, z.Name), 
     x.[MarriedDate], 
     y.[FirstSprogDate], 
     z.[FoundGodDate] 
1

要建立在大衛B的回答更是有意義的使用Common Table Expression:你想

;WITH NameKeys 
AS 
(
    SELECT DISTINCT [Name] FROM #datesX WHERE [Name] is not null 
    UNION 
    SELECT DISTINCT [Name] FROM #datesYY WHERE [Name] is not null 
    UNION 
    SELECT DISTINCT [Name] FROM #datesZ WHERE [Name] is not null 
) 
SELECT 
     n.[Name], 
     x.[MarriedDate], 
     y.[FirstSprogDate], 
     z.[FoundGodDate], 
     [HappyScoreX] = SUM(ISNULL(x.[HappyScoreX],0.0)), 
     [HappyScoreY] = SUM(ISNULL(y.[HappyScoreY],0.0)), 
     [HappyScoreZ] = SUM(ISNULL(z.[HappyScoreZ],0.0)) 
FROM NameKeys n 
LEFT JOIN #datesX x ON n.[Name] = x.[Name] 
LEFT JOIN #datesY y ON n.[Name] = y.[Name] 
LEFT JOIN #datesZ z ON n.[Name] = z.[Name] 
+0

+1爲有效的替代。 t-clausen.dk解決方案是最優雅的。 – whytheq