2016-05-30 65 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

非常感谢您的帮助。 –