【问题标题】:How to left join when only matched one record from right table仅匹配右表中的一条记录时如何左连接
【发布时间】:2021-06-11 07:28:42
【问题描述】:

我想知道当只匹配右表中的一条记录时如何左连接。
例如,

表A

id value
1 34
2 42
3 60

表B

id value tableA_id
1 20 1
2 31 1
3 50 2

我想使用left outer join 获得如下结果。

tableA_id tableA_value tableB_value
1 34 null
2 42 50
3 60 null

第一行的tableB_value为空,因为tableA.id = tableB.tableA_id匹配多条记录。

如何解决? 谢谢。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以将COUNT()用作分析函数来跟踪tableA_id在A表中出现的次数:

    SELECT a.id AS tableA_id, a.value AS tableA_value, b.value AS tableB_value
    FROM tableA a
    LEFT JOIN
    (
        SELECT *, COUNT(*) OVER (PARTITION BY tableA_id) cnt
        FROM tableB
    ) b
        ON a.id = b.tableA_id AND b.cnt = 1
    ORDER BY a.id;
    

    Demo

    【讨论】:

      【解决方案2】:

      您也可以使用 b 表上的聚合来执行此操作:

      SELECT a.id AS tableA_id, a.value AS tableA_value, b.value AS tableB_value
      FROM tableA a LEFT JOIN
           (SELECT tableA_id, MAX(value) as value
            FROM tableB
            GROUP BY tableA_id
            HAVING COUNT(*) = 1
           ) b
           ON a.id = b.tableA_id
      ORDER BY a.id;
      

      这是因为如果B 中对于给定的 id 只有一行,那么MAX() 会返回该行的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-26
        • 1970-01-01
        • 2018-01-17
        • 2019-01-26
        • 2015-10-30
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        相关资源
        最近更新 更多