这必须简单。
我有两个表:ORDERS和ORDER_LINES。非常简单和不言自明;这是一对多的关系。 ORDER_LINES有一个FULFILLED列,其中包含该特定行完成的日期。
这就是我需要做的事情:选择完成订单的所有ORDERS.ID;即,ORDER_LINES表中的任何FULFILLED列都不是该特定订单的NULL。
示例:
订单#1有两行,两行都不为空
订单#2有一行为空
查询应该只返回#1,因为它已完成。
答案 0 :(得分:0)
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
答案 1 :(得分:0)
使用左连接和添加条件来查询仅选择所需列中不为空的行。像这样。
SELECT ORDERS.ID
FROM ORDERS
LEFT JOIN ORDER_LINES
ON (ORDERS.ID = ORDER_LINES.ORDER_ID)
WHERE ORDER_LINES.ORDER_ID is not null