SQL 连接两个表并检查两个表中的每个值是不是存在

Posted

技术标签:

【中文标题】SQL 连接两个表并检查两个表中的每个值是不是存在【英文标题】:SQL Join two tables and check the existence of each value in both tablesSQL 连接两个表并检查两个表中的每个值是否存在 【发布时间】:2021-02-14 15:32:22 【问题描述】:

我们有 3 个主桌 OrderPickupDelivery 在一个OrderID 下有多个项目(1 到多个)

订单中的某些商品可能已被取走但未送达,反之亦然。 某些包含所有商品的订单可能在没有一次交付的情况下被取走,反之亦然。 某些订单的所有商品都将被取走并交付。

所以我想要一个订单 ID 列表,然后是订单的取货项目。如果订单 ID 在取件中不存在但在交付中存在,则表示取件丢失并显示“未取件” 反之亦然,如果商品在取件中但未送达,则表示未送达并显示“未送达”

从上述案例中,您可以看到下面的示例数据和预期结果

订单表

OrderID 
  1
  2
  3
  4
  5

取货台

OrderID | PickupItem | Date               OrderID | DeliveryItem | Date
  1    |   1100     | 13-02-2021            1     |   1100       | 14-02-2021
  2    |   2200     | 06-02-2021            2     |   2201       | 05-02-2021
  2    |   2201     | 06-02-2021            3     |   3300       | 03-02-2021
  3    |   3300     | 04-02-2021            3     |   3301       | 03-02-2021
  4    |   4400     | 07-02-2021            5     |   5500       | 05-02-2021

预期结果

OrderID | PickupItem       | PickupDate    | DeliveryItem      | DeliveryDate
  1     |   1100           | 13-02-2021    |     1100          |    13-02-2021
  2     |   2200           | 06-02-2021    |     Not Delivered |    Not Delivered
  2     |   2201           | 06-02-2021    |     2201          |    13-02-2021
  3     |   3300           | 04-02-2021    |     3300          |    13-02-2021
  3     |   Not Picked Up  | Not Picked Up |     3301          |    13-02-2021
  4     |   4400           | 07-02-2021    |     Not Delivered |    Not Delivered
  5     |   Not Picked Up  | Not Picked Up |     5500          |    13-02-2021

【问题讨论】:

这不就是两个左连接吗?到目前为止你有什么? 如果我取货离开加入送货,这意味着一些未取货的送货项目不会包含在结果中。例如订单 5 将不包括在内 from [order] left join pickup... left join delivery...怎么样 没想到这么简单我就试一试。但是如何在一条线上映射相同的物品在取货和交付中?例如,如果我们进行左连接,则订单 2 2200 将与 2201 在同一行/行中 您在Order 表中也没有PickupItem,或者可能没有单独的Pickup 表吗?如果不是,您的数据库设计有问题 【参考方案1】:

您的数据库设计很差,因为您没有参考点来证明PickupItem 的存在。我们需要使用嵌套的FULL JOIN 从两个表中获取结果:

select o.orderid, p.pickupitem, p.date,
       d.deliveryitem, d.date
from [order] o
left join
     (pickup p
     full join delivery d
        on d.DeliveryItem = p.pickupitem and d.orderid = p.orderid)
on o.orderid = isnull(d.orderid, p.orderid) ;

【讨论】:

d (delivery) 没有pickingItem 啊抱歉解决了这个问题 你是个传奇!我会再测试几个案例以确保【参考方案2】:

这是两个left joins,但很棘手。第二个左连接需要引用两个表——一个用于订单 ID,另一个用于商品:

select o.orderid, p.pickupitem, p.date,
       d.deliveryitem, d.date
from orders o left join
     pickups p
     on o.orderid = p.orderid left join
     delivery d
     on o.orderid = d.orderid and p.pickupitem = d.pickupitem;

【讨论】:

只有在有取件的情况下才有效,如果有没有取件的交货将不予退回。 full join 可能会成功,但这是一个糟糕的数据库设计 IMO 感谢您的回复!我现在就试试,然后回来反馈

以上是关于SQL 连接两个表并检查两个表中的每个值是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 如何连接 2 个表并检查值是不是存在

如何连接两个表并显示源?

连接两个表并从一列返回多个匹配项的 SQL 查询?

MySQL JOIN 2 个表并分别获取两个表的总和

如何检查Oracle中的项目表中是不是存在一组值

Oracle SQL 检查存在约束