仅返回表 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 的一个值的主要内容,如果未能解决你的问题,请参考以下文章
SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?