1

这一定很简单。

我有两个表:ORDERS 和 ORDER_LINES。非常简单且不言自明;这是一对多的关系。ORDER_LINES 有一个 FULFILLED 列,其中包含该特定行完成的日期。

这是我需要做的:选择已完成订单的所有 ORDERS.ID;即,对于该特定订单,ORDER_LINES 表中的 FULFILLED 列都不是 NULL。

例子:

订单 #1 有两行,两行都不为空

订单 #2 有一行为空

查询应该只返回#1,因为它是完整的。

4

2 回答 2

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
                    )

SQL 小提琴版本

使用 In 函数的替代版本:

Select *
From orders As O
Where O.OrderId Not In    (
                          Select OL1.OrderId
                          From order_lines As OL1
                          Where OL1.Fullfilled Is Null
                          )

SQL 小提琴版本

添加

人们希望使用聚合函数来实现这一点。虽然下面是一个解决方案,但使用 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

SQL 小提琴版本

另一种可能表现最好的形式:

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

SQL 小提琴版本

于 2013-05-21T04:04:44.533 回答
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
于 2013-05-21T04:05:28.067 回答