【问题标题】:sql union displays duplicatessql union 显示重复项
【发布时间】:2018-09-07 11:50:18
【问题描述】:

我想要的图片

我尝试过在 x 或 y 上加入,但没有成功,甚至 group by 也没有成功。 几乎给我的结果是下面的查询

SELECT A.Id ,A.AccNo ,A.Name ,B.Id ,B.AccNo1 ,B.AccNo2 ,B.Name 
   from Table1  as A 
   left outer  join Table2 as B on A.AccNo = B.AccNo1 
union 
 SELECT A.Id ,A.AccNo ,A.Name ,B.Id, B.AccNo1, B.AccNo2, B.Name, 
   from Table1 as A 
   left outer  join Table2 as B on A.AccNo = B.AccNo2

在查询正确后,我只想显示表之间没有链接的异常,如果重复 T1.ID 会很困难

【问题讨论】:

  • 不要发布图片。那么post table结构比data exmaples好
  • 发布的 SQL 给你一个语法错误
  • 它有效,但它给出了我不想要的重复项
  • 您使用的是哪个 RDBMS?
  • 请解释构建所需输出的逻辑是什么

标签: sql join duplicates union having


【解决方案1】:

你似乎想要一个left join

select t1.*, t2.*
from table1 t1 left join
     table2 t2
     on t1.id in (t2.accno1, t2.accno2);

【讨论】:

    【解决方案2】:

    试试:

    SELECT A.Id ,A.AccNo ,A.Name ,B.Id ,B.AccNo1 ,B.AccNo2 ,B.Name 
    from Table1  as A 
    left outer  join Table2 as B 
    ON A.AccNo = (CASE WHEN  A.AccNo = B.AccNo1 THEN B.AccNo1 ELSE B.AccNo2 END)
    

    【讨论】:

      【解决方案3】:

      您可以嵌套原始查询,然后使用 max 聚合函数进行分组:

      SELECT Id ,AccNo ,Name, max(Id2) as Id2, max(Name2) as Name2,
             max(AccNo1) as AccNo1, max(AccNo2) as AccNo2
        FROM
      (
        SELECT A.Id ,A.AccNo ,A.Name ,B.Id Id2 ,B.AccNo1 ,B.AccNo2 ,B.Name Name2
           from Table1  as A 
           left outer  join Table2 as B on A.AccNo = B.AccNo1 
        union 
         SELECT A.Id ,A.AccNo ,A.Name ,B.Id Id2, B.AccNo1, B.AccNo2, B.Name Name2
           from Table1 as A 
           left outer  join Table2 as B on A.AccNo = B.AccNo2
      ) q  
      GROUP BY Id ,AccNo ,Name;
      

      SQL Fiddle Demo

      【讨论】:

        【解决方案4】:

        执行LEFT JOIN 以返回 table1 值以及匹配的 table2 值(其中 t2.accno2 = t1.accno):

        select t1.*, t2.*
        from table1 t1
        left join table2 t2
             on t1.accno = t2.accno2
        

        或者,也许您也想要 table2 值来匹配 accno1?

        select t1.*, t2.*
        from table1 t1
        left join table2 t2
             on t1.accno in (t2.accno1, t2.accno2)
        

        【讨论】:

          【解决方案5】:

          这样解决:

          SELECT
           t1.id,
           t1.accno,
           t1.name,
           (
               SELECT DISTINCT
                   id
               FROM
                   table2
               WHERE
                   accno2 = t1.accno
           ),
           (
               SELECT DISTINCT
                   name
               FROM
                   table2
               WHERE
                   accno2 = t1.accno
           ),
           (
               SELECT DISTINCT
                   accno1
               FROM
                   table2
               WHERE
                   accno2 = t1.accno
           ),
           (
               SELECT DISTINCT
                   accno2
               FROM
                   table2
               WHERE
                   accno2 = t1.accno
           ) FROM
           table1 t1
           LEFT JOIN table2 t2 ON t1.accno = t2.accno1 OR t1.id = t2.id
          

          【讨论】:

          • 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
          • select t1.id, t1.accno, t1.name, (select distinct id from table2 where accno2=t1.accno), (select distinct name from table2 where accno2=t1.accno), ( select distinct accno1 from table2 where accno2=t1.accno), (select distinct accno2 from table2 where accno2=t1.accno) from table1 t1 left join table2 t2 on t1.accno = t2.accno1 or t1.id=t2.id
          • 我更改了答案中的代码 - 请标记为好答案。谢谢
          猜你喜欢
          • 2019-06-29
          • 2021-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-31
          • 2020-12-29
          • 2023-03-06
          • 2020-07-21
          相关资源
          最近更新 更多