从左表返回所有行,从右表返回不同的匹配行

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

【讨论】:

以上是关于从左表返回所有行,从右表返回不同的匹配行的主要内容,如果未能解决你的问题,请参考以下文章

mysql join

每日日报

SQL-JOIN链接

SQL JOIN使用方法

JOIN方法也是连贯操作方法之一

帮忙讲解一下sqlserver中查询语句关联的意思。