【问题标题】:SQL after the JOIN remove duplicate rowsJOIN 删除重复行后的 SQL
【发布时间】:2017-09-12 02:40:09
【问题描述】:

我有桌子 T1

ID   STATUS
1    NEW
2    CLOSED
3    NEW

我有桌子 T2

ID   OWNER 
1    A
1    B
1    C
1    A
1    B
2    A
2    B
2    A
3    A

我想加入 T1 和 T2 并为每个不同的 ID 和每个不同的 OWNER 设置多行。如果 OWNER 在 T2 中重复多次,则应忽略该重复项并删除重复项。

所以最终想要的结果应该是:

ID  STATUS  OWNER
1   NEW     A
1   NEW     B
1   NEW     C
2   CLOSED  A
2   CLOSED  B
3   NEW     A

因此您可以看到应该删除重复项(同一 ID 的同一所有者多次)。我只需要将输出作为 ID 列表和该 ID 的每个不同的 OWNER,但他在 T2 表中负责多少次并不重要。我需要做出某种区分。

如果我像这样进行查询,我不会得到每个 ID 和 OWNER 的不同值,但在这种情况下我也有重复。

    select t1.id,t1.status,t2.owner 
    FROM  t1
    join t2 
    on t1.id=t2.id 

【问题讨论】:

    标签: sql select join duplicates db2


    【解决方案1】:

    如果我理解正确,你需要这个:

    select T1.ID, T1.STATUS, t.OWNER from T1
    inner join(
        select ID, OWNER from T2 group by ID, OWNER
    ) t
    on T1.ID = t.ID 
    

    【讨论】:

    • 谢谢你的作品!!!我将其标记为答案。只是一个简短的问题。如果我需要过滤 T2 我应该在哪里添加额外的 sql 语句:在 T 大括号内或在查询末尾?对于 T1 的额外过滤,我想我在查询末尾添加它,但对于 T2 我有疑问???谢谢
    • 如果该过滤器只属于T2表,那么您可以将此语句添加到子查询中。 (在 T 大括号内)。
    • 在内部联接中使用另一组 select 语句与 group by 希望字段使查询执行时间更短且更快。谢谢。
    【解决方案2】:

    您可以在查询中使用 distinct keyward 来获得所需的结果。

    select distinct  t1.id,t1.status,t2.owner 
        FROM  t1
        join t2 
        on t1.id=t2.id 
    

    【讨论】:

      【解决方案3】:
      with T2b as (
        select * from (
          select t2.*, rownumber() over(partition by t2.ID, t2.OWNER ) rang
          from t2
        ) tmp 
        where rang=1
      )
      select t1.*, T2b.OWNER 
      from t1 inner join T2b on t1.id=T2b.id 
      

      【讨论】:

        【解决方案4】:

        总而言之,相当蛋糕。

        create table #T1 ([ID] int, [Status] varchar(50))
        INSERT INTO #T1 VALUES
        (1, 'NEW'),
        (2, 'CLOSED'),
        (3, 'NEW')
        
        create table #T2 ([ID] int, [Owner] varchar(50))
        INSERT INTO #T2 VALUES
        (1, 'A'),
        (1, 'B'),
        (1, 'C'),
        (1, 'A'),
        (1, 'B'),
        (2, 'A'),
        (2, 'B'),
        (2, 'A'),
        (3, 'A')
        
        SELECT DISTINCT
         T.[ID],
         T.[Status],
         U.[Owner]
            FROM #T1 T
        JOIN #T2 U ON T.[ID] = U.[ID]
        

        我在 SSMS 中的 SQL Server 中执行了这项工作,但几乎任何与 SQL 兼容的引擎都应该毫无问题地完成这项工作。

        抱歉,我认为在示例中可能需要学习一个独特的行减少课程,但后来只是 DISTINCT 完成了所有工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-24
          • 1970-01-01
          • 2020-04-22
          • 2011-12-30
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多