2016-05-30 66 views
0

關於如何刪除左外連接中的重複記錄,SO上有很多問題。我在兩個表Table1和Table2之間有一個簡單的左外部聯接,其中Table1與Table2有一對多的關係(我在這裏直接寫了這個簡單的查詢來解釋我之後的事情,而不是實際的查詢),在左外連接中顯示重複值一次

SELECT a.ID, a.Name, b.Value 
FROM Table1 a 
LEFT OUTER JOIN Table2 b ON a.ID == b.Table1_ID 

現在返回的結果是這樣,

ID Name  Value 
1  Test1 TestValue1 
1  Test1 TestValue2 
1  Test1 TestValue3 
1  Test1 NULL 
2  Test2 TestValue4 
2  Test2 NULL 
2  Test2 TestValue5 

現在這個輸出是正確的,我明白,這是一個正確的行爲。但有什麼方法可以讓我得到以下輸出。這可能很簡單,但是我之前沒有這樣做過,每次我搜索我遇到的問題和線索都要求刪除重複項。我不想刪除重複項。只是想表明只有一次像下面從表1的值,

ID Name  Value 
1  Test1 TestValue1 
       TestValue2 
       TestValue3 
       NULL 
2  Test2 TestValue4 
       NULL 
       TestValue5 
+0

這應該在應用程序方面完成。 –

回答

1

您可以使用ROW_NUMBER來確定相關值中的第一行:

WITH CTE AS(
    SELECT 
     a.ID, 
     a.Name, 
     b.Value, 
     Rn = ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY (SELECT NULL)) 
    FROM Table1 a 
    LEFT JOIN Table2 b 
     ON a.ID = b.Table1_ID 
) 
SELECT 
    ID = CASE WHEN Rn = 1 THEN CONVERT(VARCHAR(10), a.ID) ELSE '' END), 
    Name = CASE WHEN Rn = 1 THEN Name ELSE '' END), 
    Value 
FROM CTE 

更換ORDER BY (SELECT NULL))與列你想要的ROW_NUMBER到以...爲基礎。

+0

我明白,在應用程序方面,然後在數據庫中更容易,但它是一些獨特的要求,其中數據必須直接從數據庫呈現給某人。感謝您的熱心幫助。 –

1

通常,這種類型的數據處理將在應用層完成。你可以在數據庫中做到這一點,但這不是一個好主意。 SQL結果集是無序的,除非您明確擁有order by

SELECT (CASE WHEN seqnum = 1 THEN id END) as id, 
     (CASE WHEN seqnum = 1 THEN name END) as name, 
     value 
FROM (SELECT a.ID, a.Name, b.Value, 
      ROW_NUMBER() OVER (PARTITION BY a.id, a.name ORDER BY (SELECT NULL)) as as seqnum 
     FROM Table1 a LEFT OUTER JOIN 
      Table2 b 
      ON a.ID = b.Table1_ID 
    ) 
ORDER BY id, name, seqnum; 
+0

非常感謝您的幫助。 –