仅返回表 B 中存在的表 A 的一个值

Posted

技术标签:

【中文标题】仅返回表 B 中存在的表 A 的一个值【英文标题】:Return only one value of Table A where exists in Table B 【发布时间】: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 【参考方案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,因为它更容易阅读(它完全按照它所说的那样做!)此外,更多关于性能问题的信息:***.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)

【讨论】:

以上是关于仅返回表 B 中存在的表 A 的一个值的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 只返回两个表之间存在差异的记录

sql Oracle:仅当值存在时才从另一个表中插入值

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?

SqlServer中如何判断一个表是不是已存在?

如何更新引用重复记录的表?