【问题标题】:Show duplicates values in Left outer join once在左外连接中显示重复值一次
【发布时间】:2016-09-27 18:30:47
【问题描述】:

关于如何删除左外连接中的重复记录有很多问题。我在两个表 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

现在这个输出是正确的,我知道这是一个正确的行为。但是有什么方法可以让我得到以下输出。这可能很简单,但我之前没有这样做过,每次我搜索解决方案时都会遇到问题和线程要求删除重复项。我不想删除重复项。只想显示 Table1 中的值一次,如下所示,

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

【问题讨论】:

  • 这应该在应用端完成。

标签: sql sql-server-2012


【解决方案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 所基于的列。

【讨论】:

  • 我知道在应用程序端比在数据库中更容易,但这是一些独特的要求,数据必须直接从数据库呈现给某人。感谢您的热心帮助。
【解决方案2】:

通常,这种类型的数据处理将在应用层完成。您可以在数据库中执行此操作,但这不是一个好主意。 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;

【讨论】:

  • 非常感谢您的帮助。
猜你喜欢
  • 2015-06-13
  • 2010-09-26
  • 2020-01-08
  • 2013-03-02
  • 2013-03-03
  • 2013-04-03
  • 2018-07-11
  • 1970-01-01
相关资源
最近更新 更多