首页 > 解决方案 > 仅返回其他表中缺少的记录的 SQL 联接

问题描述

考虑 SQL Server 数据库中的两个表:

命令

OrderId | OrderType | etc...

运输

ShipmentId | OrderId | ShipType | etc..

我正在尝试编写一个返回OrderIds 的选择语句:

where Order.OrderType = 'EXCHANGE' 

Shipment并且表中没有对应的记录

Shipment.OrderId = Order.OrderId and Shipment.ShipType = 'BOX'

这样做的原因是,根据具体情况OrderType,一个 BOX 可能会或可能不会被运送给客户。我想获取所有属于OrderType = 'EXCHANGE'但没有相应 BOX 装运的 OrderId,以便将它们转发以进行装运。

标签: sql-servertsql

解决方案


您可以使用not exists

select o.*
from order o
where o.OrderType = 'EXCHANGE' and
      not exists (select 1
                  from shipment s
                  where s.OrderId = o.OrderId and s.ShipType = 'BOX'
                 );

注意:正如所写的那样,这是行不通的,因为order它是一个 SQL 关键字和保留字——这使得它成为一个非常糟糕的表名选择(你可以转义这个名字,尽管你没有在问题中)。我建议您将其称为其他名称,例如orders.


推荐阅读