SQL - 查找已完成所有订单的帐户

时间:2012-10-29 13:50:07

标签: sql oracle9i

我已经在谷歌漫游了几个小时了。

有两张桌子:

AccountTable 
ID | AccountID | OrderID

OrderTable
ID | OrderID | OrderStatus

OrderStatus的值为1,2,3,4,其中4为完成状态。

在订单表中,在更新订单状态时添加多行。 因此,对于已完成的订单,您将在OrderTable中分别拥有4行,分别为1,2,3和4状态。

单个帐户可以有多个订单。

我想找到所有订单已完成的帐户。

我发现了这么多:

select * from AccountTable
INNER JOIN OrderTable
ON AccountTable.OrderID = OrderTable.OrderID
AND OrderTable.OrderStatus = 4

这将选择至少有一个订单处于已完成状态的帐户。

但这不会涵盖一个订单完成而另一个订单不同的情况。我当时不想选择帐户。

编辑: 我只想展示一些数据以使其更清晰:

AccountTable
1 | Name1 | Order1
2 | Name1 | Order2
3 | Name2 | Order3
4 | Name2 | Order4

OrderTable
1 | Order1 | 1
2 | Order1 | 2
3 | Order1 | 3

4 | Order2 | 1
5 | Order2 | 2
6 | Order2 | 3
7 | Order2 | 4

8 | Order3 | 1
9 | Order3 | 2
10 | Order3 | 3
11 | Order3 | 4

12 | Order4 | 1
13 | Order4 | 2
14 | Order4 | 3
15 | Order4 | 4

我只想检索Name2而不是Name1。

3 个答案:

答案 0 :(得分:1)

假设您的业务逻辑不会被破坏,我认为您希望完成订单数量(状态== 4)的帐户与已启动的订单数量相同(状态== 1):

  SELECT AccountID
    FROM (SELECT AccountTable.AccountID AS AccountID,
                 SUM(CASE OrderTable.OrderStatus WHEN 1 THEN 1 ELSE 0 END) AS o1,
                 SUM(CASE OrderTable.OrderStatus WHEN 4 THEN 1 ELSE 0 END) AS o4
            FROM AccountTable
            INNER JOIN
                 OrderTable
              ON AccountTable.OrderID = OrderTable.OrderID
        GROUP BY 1) d
   WHERE o1 = o4;

您可以从那里加入以获取AccountTable的所有字段。

顺便说一句,在我看来,你的表格被误导性地命名。 AccountTable Account2Orders 表,而OrderTable则是 OrderStagesOrLifeCycle 表。

答案 1 :(得分:0)

没有加入,subselect。您也不会寻找一个完美的订单 - 您查找的订单没有没有状态4条目的订单。即订单EXISTS没有状态4的帐户。

检查SQL Exists子句和group by。你将首先获得一个显示没有状态4的订单的查询,然后你可以将它加入订单表。

答案 2 :(得分:0)

已编辑 - 现在更好地了解您的数据:

Select
  c.AccountID
From (
  Select
    a.AccountID,
    o.OrderID,
    Max(o.OrderStatus) As OrderState
  From
    AccountTable a
      Inner Join
    OrderTable o
      On a.OrderID = o.OrderID
  Group By
    a.AccountID,
    o.OrderID
) c
Group By
  c.AccountID
Having
  Min(c.OrderState) = 4;