【问题标题】:SQL query with Left Join to return results when the top 1 column of joined table matches column of main table当连接表的前 1 列与主表的列匹配时,使用左连接的 SQL 查询返回结果
【发布时间】:2020-02-11 17:45:57
【问题描述】:

我有一个主表 (TableA),我要加入 TableB,但我只想包含两个表的 ColumnB 匹配的 TableB 的第一条记录。我已经让它在下面的查询中工作,除了我还需要包含 TableA 的记录,其中 TableB 不存在匹配的记录(即在下面的查询中 b.ColumnA 将为空)。我明白为什么我在“OR b.ColumnA = null”下面的行不起作用,但我正在努力寻找可行的解决方案。

任何合理的方法也包括 TableA 的记录,而 TableB 中不存在匹配的记录

SELECT b.ColumnA, a.ColumnA, a.ColumnB
FROM TableA a
LEFT JOIN TableB b ON b.ColumnB = a.ColumnB
WHERE b.ColumnA = (SELECT TOP 1 bb.ColumnA FROM TableA aa LEFT JOIN TableB bb ON bb.ColumnB = a.ColumnB)
OR b.ColumnA = null

【问题讨论】:

    标签: sql sql-server left-join


    【解决方案1】:

    使用OUTER APPLY:

    SELECT b.ColumnA, a.ColumnA, a.ColumnB
    FROM TableA a OUTER APPLY
         (SELECT TOP (1) b.*
          FROM TableB b 
          WHERE b.ColumnB = a.ColumnB
          ORDER BY ?  -- however you are defining the ordering for "first"
         ) b;
    

    如果您对来自b任意 匹配记录感到满意,您可以省略ORDER BY。但是,问题指定了“第一”而不定义它。

    【讨论】:

    • 这就像一个魅力。我在 OUTER APPLY 之后添加了 WHERE 和 ORDER BY 语句,效果很好。谢谢。
    • 另外...我没有在OUTER APPLY内下单,因为在我们的例子中如果匹配不止一个,那就是错误,所以我需要任意选择一个。
    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2021-07-15
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多