从左表返回所有行,从右表返回不同的匹配行
Posted
技术标签:
【中文标题】从左表返回所有行,从右表返回不同的匹配行【英文标题】:Return all rows from the left table, and distinct matched rows from the right table 【发布时间】:2016-09-08 21:32:16 【问题描述】:W3schools:
LEFT JOIN:返回左表的所有行,以及匹配的行 从右表
目标:从右表添加单列
挑战:右表有很多重复行
目标:希望连接返回与左表中的确切行数相同的行数,或者换句话说,返回右表中不同的匹配行
示例更新:
每张图片的客户太多,因此可能会重复一个 ImageID。我想从客户方面退回一个。
SELECT Images.ImageID, Customers.BooleanColumn
FROM Images
LEFT JOIN Customers
ON Images.ImageID = Customers.ImageID
【问题讨论】:
更改连接谓词以包含更多列。 @SeanLange,我为什么要这样做? 我怎么知道?您的问题根本没有任何信息,所以这是我的疯狂猜测。说真的,我可以想到几种方法来实现这一点,但这一切都取决于实际的细节。 它对问题的描述很模糊,是的......但这不足以被认为是一个完整的问题。 如果您想要第一个表中的所有记录(称为 TABLE_A)和第二个表中的那些不同匹配项(称为 TABLE_B),您可以使用 group by 子句和表连接。在这种情况下,您必须小心从 TABLE_B 中分组的列,因为它们会影响返回的行数 【参考方案1】:如果您想根据 ImageID 和 BooleanColumn 对结果集进行分组,请使用以下脚本。
SELECT Images.ImageID, Customers.BooleanColumn
FROM Images
LEFT JOIN Customers
ON Images.ImageID = Customer.ImageID
Group by Images.ImageID, Customers.BooleanColumn
如果您想检查至少一个链接到 ImageID 的客户,请使用以下任何脚本。
SELECT DISTINCT ImageID
, ( case when Customers.ImageId is null Then 0 Else 1) BooleanValue
FROM Images
LEFT JOIN Customers
ON Images.ImageID = Customers.ImageID
或
SELECT ImageId,
ISNULL ( (Select 1 from customers c
Where c.imageId=I.imageid),0)BooleanValue
FROM Images I
【讨论】:
【参考方案2】:仍然没有可使用的示例数据或期望的结果。这些被认为是诸如此类的在线问题的基本要素。因此,此代码未经测试,但它应该提供我认为您正在寻找的内容。
select i.ImageID
, c.BooleanColumn
from Images i
outer apply
(
select top 1 BooleanColumn
from Customers c2
order by c2.CustomerID --or whatever column you need for ordering
) c
【讨论】:
以上是关于从左表返回所有行,从右表返回不同的匹配行的主要内容,如果未能解决你的问题,请参考以下文章