【问题标题】:MySQL JOIN: Only return rows where all values from right table are NULLMySQL JOIN:仅返回右表中所有值均为 NULL 的行
【发布时间】:2020-06-02 09:28:38
【问题描述】:

我有两个这样的 MySQL 表:

orders:
+----------+------+
| order_id | name |
+----------+------+
| 1        | Mary |
| 2        | John |
| 3        | Anne |
+----------+------+

order_details:
+----------+----------------+
| order_id | shipped        |
+----------+----------------+
| 1        | null           |
| 1        | null           |
| 1        | SHIPPED-123ABC |
| 2        | null           |
| 2        | null           |
| 3        | SHIPPED-XYZ    |
| 3        | SHIPPED-XYZ    |
| 3        | null           |
+----------+----------------+

现在我想将 order_details-table 加入到 orders-table 但只显示 order_details 表中只有 NULL 发货值的条目。所以在这个例子中,只有 order_id #2 会被返回。

所以结果是:

+----------+------+---------+
| order_id | name | shipped |
+----------+------+---------+
| 2        | John | null    |
+----------+------+---------+

谢谢!

【问题讨论】:

标签: mysql sql


【解决方案1】:

您可以使用not exists

select o.order_id, o.name, null as shipped 
from orders o
where not exists (select 1 
                  from order_details od 
                   where od.order_id = o.order_id and od.shipped is not null
                 );

JOIN 的简单聚合也可以:

select o.order_id, o.name, null as shipped
from orders o inner join
     order_details od
     on od.order_id = o.order_id
group by o.order_id, o.name
having min(od.shipped) = max(od.shipped) and min(od.shipped) is null;

【讨论】:

    【解决方案2】:

    如果您想要在order_details 中至少有 一个 行的订单,请使用聚合:

    select o.*
    from (select od.order_id
          from order_details 
          group by od.order_id
          having count(shipped) = 0
         ) od join
         orders o
         on od.order_id = o.order_id;
    

    如果您想要所有这样的订单,即使是order_details 中没有行的订单,请使用not exists

    select o.*
    from orders o
    where not exists (select 1
                      from order_details od
                      where od.order_id = o.order_id and
                            od.shipping is not null
                     );
    

    【讨论】:

      【解决方案3】:

      检查下面的查询是否给出了你想要的。

      SELECT
        o.order_id,
        o.name,
        od.shipped
      FROM
        orders o
        INNER JOIN order_details od ON od.order_id = o.order_id
      WHERE
        od.shipped IS NULL
        AND od.shipped NOT IN     
      (
      SELECT od.shipped
      WHERE
          od.shipped IS NOT NULL
           )
      

      【讨论】:

        猜你喜欢
        • 2021-02-09
        • 1970-01-01
        • 2017-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多