SQL 连接两个表并检查两个表中的每个值是不是存在
Posted
技术标签:
【中文标题】SQL 连接两个表并检查两个表中的每个值是不是存在【英文标题】:SQL Join two tables and check the existence of each value in both tablesSQL 连接两个表并检查两个表中的每个值是否存在 【发布时间】:2021-02-14 15:32:22 【问题描述】:我们有 3 个主桌 Order
、 Pickup
和 Delivery
在一个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 join
s,但很棘手。第二个左连接需要引用两个表——一个用于订单 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 连接两个表并检查两个表中的每个值是不是存在的主要内容,如果未能解决你的问题,请参考以下文章