sql - 嵌套选择不为空的 SQL
问题描述
我有一张Customers
桌子CustomerID
和CustomerName
。
然后我有一张Orders
桌子,有CustomerID
,datetime OrderPlaced
和datetime OrderDelivered
。
请记住,并非所有客户都已下订单,我想获取 的列表CustomerName
,但仅针对已下订单且已交付订单的客户,并且仅针对每位客户的最新OrderPlaced
订单。OrderDelivered
OrderPlaced
我开始做(完全意识到这还没有实现OrderDelivered
对它的限制,但已经没有做我想要的):
SELECT CustomerID,
(SELECT TOP 1 OrderDelivered
FROM Orders ORDER BY OrderDelivered DESC) AS OrderDelivered
FROM Customer
WHERE OrderDelivered IS NOT NULL
但是 MS SQL 已经不喜欢这样了,它说它不知道子句OrderDelivered
上有什么。WHERE
我怎样才能做到这一点?
解决方案
Personally, I would move your subquery into the FROM
and use CROSS APPLY
. Then you can far more easily reference the column:
SELECT C.CustomerID,
O.OrderDelivered
FROM Customer C
CROSS APPLY (SELECT TOP 1 OrderDelivered
FROM Orders oa
WHERE oa.CustomerID = C.CustomerID --Guess column name for orders
AND O.OrderDelivered IS NOT NULL
ORDER BY O.OrderDelivered DESC) O;
As, however, this is a CROSS APPLY
, then the results will already be filtered; so no need for the WHERE
.
推荐阅读
- oracle - 如何将 bcp 实用程序与 oracle dB 或任何其他更好的选项一起使用
- excel - 使用相同的代码循环多个范围
- macos - MacBook Pro - 语言自动更改,需要永久修复
- dml - 从 GCP 控制台禁用 DML 执行
- wifi - ESP32 扫描时看不到 Wifi 网络?
- javascript - reactjs如何过滤/检查数组中的任何对象是否存在于另一个对象数组中?
- c++ - 解决方案在第 25 行执行时出现错误“越界”
- angular - 延迟加载模块的 Angular PreloadAllModules 不起作用
- r - Docker:如何获得 $HOME 的所有权?
- java - TextView hieght = wrap_content 不起作用