sql-server - 仅返回其他表中缺少的记录的 SQL 联接
问题描述
考虑 SQL Server 数据库中的两个表:
命令
OrderId | OrderType | etc...
运输
ShipmentId | OrderId | ShipType | etc..
我正在尝试编写一个返回OrderId
s 的选择语句:
where Order.OrderType = 'EXCHANGE'
Shipment
并且表中没有对应的记录
Shipment.OrderId = Order.OrderId and Shipment.ShipType = 'BOX'
这样做的原因是,根据具体情况OrderType
,一个 BOX 可能会或可能不会被运送给客户。我想获取所有属于OrderType = 'EXCHANGE'
但没有相应 BOX 装运的 OrderId,以便将它们转发以进行装运。
解决方案
您可以使用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
.
推荐阅读
- javascript - 如何通过变量元素的标签名称找到子元素?
- python - -W 如何与 DeprecationWarning 和 PendingDeprecationWarning 交互?
- amazon-web-services - 对于 AWS 区域内的每个可用区
- c++ - C++ 模板和参数化 Google 测试
- python - Plotly express 运行良好的地图不能作为 Pyinstaller exe 工作
- shell - 使用 symfony5、ffmpeg 处理
- azure - Azure 开发服务器上的随机错误 - MVC 5 + EF6
- operating-system - 内存管理中的分页和绑定方案
- javascript - JFrog 将 docker 镜像从远程存储库复制/复制到本地存储库
- android - 在不使用保存按钮的情况下保存editText,应用程序停止工作