仅在收到所有订单明细时显示订单

时间:2014-06-13 14:39:34

标签: sql ms-access

我有两张表OrderHeaderOrderDetail表。我需要做的是检查StatusFK表中的Detail以查找与OrderHeader表相关的每条记录。

因此,如果StatusFK = 2表中Detail中的所有相关记录,我希望在查询中显示该记录,因为我将在OrderHeader记录上运行更新以更改其{ {1}}收到。

但是说详细信息表中有6条与Status表相关的记录,但是只有6条记录中有5条记录OrderHeader,那么我不希望它显示为未准备就绪被归类为完全收到?

我希望有人能够理解我所说的话,希望能帮助我实现这个目标!

4 个答案:

答案 0 :(得分:3)

如果我理解正确你只需要OrderHeaders,其中订单明细记录的数量等于statusFK为2的OrderDetails的数量。

您可以使用SUM / IIF并将其与HAVING子句中的详细记录计数进行比较

SELECT OrderHeader.OrderID, OrderHeader.Name
FROM OrderHeader 
     INNER JOIN OrderDetail
     ON OrderHeader.OrderId = OrderDetail.OrderId
GROUP BY OrderHeader.OrderID, OrderHeader.Name
HAVING 
      Count(OrderDetail.OrderId )   = SUM(IiF (OrderDetail.StatusFK = 2 ,1,0) ) 

答案 1 :(得分:0)

在SQL中,诀窍是在LEFT JOIN中查询未收到状态的订单详细信息,并测试是否存在不需要状态的行。

不知道您的MS Access版本,我无法保证确切的语法,但类似以下的查询应该可以解决问题。

SELECT OrderHeader.*, OrderDetail.* FROM OrderDetail
JOIN OrderHeader ON HeaderFK = HeaderID
LEFT JOIN OrderDetail AS OrderDetailNotReceived ON OrderDetailNotReceived.HeaderFK = HeaderID AND OrderDetailNotReceived.StatusFK < 2
WHERE OrderDetailNotReceived.DetailID IS NULL;

答案 2 :(得分:0)

感谢您的帮助,这是我完成的查询,看起来它正在诀窍,我只需将其合并到我的更新查询中

SELECT tblOrder.OrderPK
  FROM tblOrder 
   INNER JOIN tblOrderDetail
    ON tblOrder.OrderPK = tblOrderDetail.OrderFK
GROUP BY tblOrder.OrderPK
  HAVING 
   Count(tblOrderDetail.OrderFK )   = SUM(IiF (tblOrderDetail.StatusFK = 2 ,1,0) )

答案 3 :(得分:0)

我刚刚意识到我的上述查询是只读的,因为它包含Totals,我需要能够将它链接到一个可更新的查询吗?

有一种简单的方法来解决这个问题吗?

谢谢