这一定很简单。
我有两个表:ORDERS 和 ORDER_LINES。非常简单且不言自明;这是一对多的关系。ORDER_LINES 有一个 FULFILLED 列,其中包含该特定行完成的日期。
这是我需要做的:选择已完成订单的所有 ORDERS.ID;即,对于该特定订单,ORDER_LINES 表中的 FULFILLED 列都不是 NULL。
例子:
订单 #1 有两行,两行都不为空
订单 #2 有一行为空
查询应该只返回#1,因为它是完整的。
这一定很简单。
我有两个表:ORDERS 和 ORDER_LINES。非常简单且不言自明;这是一对多的关系。ORDER_LINES 有一个 FULFILLED 列,其中包含该特定行完成的日期。
这是我需要做的:选择已完成订单的所有 ORDERS.ID;即,对于该特定订单,ORDER_LINES 表中的 FULFILLED 列都不是 NULL。
例子:
订单 #1 有两行,两行都不为空
订单 #2 有一行为空
查询应该只返回#1,因为它是完整的。
Select *
From orders As O
Where Not Exists (
Select 1
From order_lines As OL1
Where OL1.Fullfilled Is Null
And OL1.OrderId = O.OrderId
)
使用 In 函数的替代版本:
Select *
From orders As O
Where O.OrderId Not In (
Select OL1.OrderId
From order_lines As OL1
Where OL1.Fullfilled Is Null
)
添加
人们希望使用聚合函数来实现这一点。虽然下面是一个解决方案,但使用 Exists 和 In 函数的表单比以下查询更好地表达了意图,因此我建议使用这两种形式中的一种:
Select O.OrderId
From Orders As O
Left Join Order_Lines As OL
On OL.OrderId = O.OrderId
And OL.Fullfilled Is Null
Group By O.OrderId
Having Count(OL.Id) = 0
另一种可能表现最好的形式:
Select O.OrderId
From Orders As O
Left Join Order_Lines As OL
On OL.OrderId = O.OrderId
And OL.Fullfilled Is Null
Where OL.Id Is Null
使用左连接并添加条件以查询仅在所需列中不为空的行的选择。像这样。
SELECT ORDERS.ID
FROM ORDERS
LEFT JOIN ORDER_LINES
ON (ORDERS.ID = ORDER_LINES.ORDER_ID)
WHERE ORDER_LINES.ORDER_ID is not null