【问题标题】:Return only one value of Table A where exists in Table B仅返回表 B 中存在的表 A 的一个值
【发布时间】:2017-05-02 20:12:54
【问题描述】:

查找表 A 中存在于表 B 中的唯一记录。

表 A

CustID, name, addr1
A001, Bill Adams, 123 main st
B007, Jon Brown, 229 oak st
C029, Sue Cook, 16 park ave

表 B

CustID, invoice_no
A001, 189
A001, 202
A001, 243
C029, 212

期望的结果:表 B 中只有 1 个 A001 实例,而不是 3 个:

A001, Bill Adams
C029, Sue Cook

当前sql:

select A.CustID, A.name
from table A
join table B on A.custID = B.custID

【问题讨论】:

  • 只需将DISTINCT 添加到您的选择或切换到EXISTS

标签: sql db2


【解决方案1】:

这样的事情应该可以工作:

SELECT A.CustID, A.Name, A.Addr1
FROM Table A
JOIN (SELECT DISTINCT CustID From Table) B ON A.CustID = B.CustID

您也可以使用 WHERE EXISTS 代替 JOIN,但我的理解是 JOIN 会有更好的性能。

【讨论】:

  • 性能会根据 B 表的大小和 DISTINCT 的成本而有所不同。就我个人而言,我更喜欢使用 EXISTS,因为它更容易阅读(它完全按照它所说的那样做!)此外,更多关于性能问题的信息:stackoverflow.com/questions/2177346/…
【解决方案2】:

由于类似于笛卡尔积的连接而发生重复。

如果你使用这样的东西,它应该可以工作:

SELECT A.CustID, A.name
FROM table A
WHERE EXISTS (SELECT * FROM B WHERE A.custID= B.custID)

【讨论】:

    【解决方案3】:

    我最后只是添加了

    select distinct A.custID, A.name
    

    正如@dnoeth 建议的那样,除非这种方法存在问题。似乎对我有用。

    【讨论】:

    • 在您需要添加其他列或连接之前应该可以正常工作。如果这永远不会发生......没问题!
    【解决方案4】:

    解决方案 1

    select * from tableA f1
    inner join lateral
    (
     select * from TableB f2
     where f1.CustID=f2.CustID
     fetch first rows only
    ) f3 on 1=1
    

    【讨论】:

      【解决方案5】:

      解决方案 2:

      select distinct f1.* 
      from tableA f1
      inner join TableB f2 on f1.CustID=f2.CustID
      

      【讨论】:

        【解决方案6】:

        解决方案 3:

        select * from tableA f1
        where f1.CustID in ( select f2.CustID  from TableB f2)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-09
          • 2021-06-27
          • 1970-01-01
          • 2015-12-18
          • 2019-05-16
          相关资源
          最近更新 更多