1

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

有两张桌子:

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。

4

3 回答 3

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表。

于 2012-10-29T14:08:13.990 回答
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;
于 2012-10-29T13:59:53.140 回答
0

不加入,子选择。您也不会寻找已完成的订单 - 您会寻找没有订单且没有状态 4 条目的帐户。即存在订单的帐户没有状态 4。

为此检查 SQL Exists 子句和分组依据。您将首先获得一个显示没有状态 4 的订单的查询,然后您可以将其加入订单表。

于 2012-10-29T13:55:06.323 回答