返回没有在MySQL中进行销售的区域的行

时间:2010-12-16 06:52:33

标签: mysql sql

我正在尝试创建一个mySql查询,以返回没有为其分配费率的订单列表。目前我有:

SELECT * FROM Order
RIGHT JOIN Region ON Region.RegionID = Order.RegionID
LEFT JOIN RateSet ON RateSet.OrderID  = Order.OrderID  
LEFT JOIN Rate ON Rate.SalesID = RateSet.RateSetID
WHERE Rate.RateID IS NULL

上述查询似乎实现了这一点,但我想更进一步,只返回该地区所有订单都没有费率的订单。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

不寻常的情况 - 我完全不确定我理解为什么你在LEFT JOIN条件中有正确的联接;这是使我的大脑短路的事情。

你有4张桌子:

  • 订单 - 列OrderID,RegionID,...
  • 地区 - 列RegionID,...
  • 费率 - 列RateID,SalesID,...
  • RateSet - 列RateSetID,OrderID,...

我们可以猜测,对于表 Xyz XyzID 列是表的主键。我们可以猜测表中的 PqrID 列引用表 Pqr (SalesID除外,它没有相应的表 Sales - 但它似乎是加入Rate和RateSet的外键(模式中令人费解的不一致)。

在问题中提供此信息会很有帮助。你也许可以更快地得到答案。

给定订单似乎有一个(可能是几个)与之关联的费率集。给定名称,似乎给定的费率集可以具有与其相关联的多个费率,包括零。目前尚不清楚是否可以在没有任何相关费率集的情况下创建订单,因此我们将采取保守的观点,认为它可能会发生。

我认为我们不需要从地区中选择; orders表中的RegionID足以识别该区域。以下查询列出了每个订单的订单信息,其中RateSet表中没有信息,或者RateSet的Rate表中没有信息。

SELECT DISTINCT O.*
  FROM      Order   AS O
  LEFT JOIN RateSet AS S ON S.OrderID  = O.OrderID  
  LEFT JOIN Rate    AS T ON T.SalesID  = S.RateSetID
 WHERE T.RateID IS NULL

现在,哪个地区有一个或多个订单,但该地区的订单之一没有订单?

SELECT G.RegionID
  FROM Region AS G
 WHERE NOT EXISTS
       (SELECT DISTINCT O.RegionID
          FROM Order AS O
          JOIN RateSet AS S ON O.OrderID   = S.OrderID
          JOIN Rate    AS T ON S.RateSetID = T.SalesID
       )

子选择列出已分配费率的订单的RegionID值 - 使用内部联接意味着只选择具有费率的行。不在该列表中的区域是唯一的“没有订单没有费率的区域”的候选区域。因此,我们将该表与上一个查询一起加入:

SELECT DISTINCT O.*
  FROM      Order   AS O
  LEFT JOIN RateSet AS S ON S.OrderID  = O.OrderID  
  LEFT JOIN Rate    AS T ON T.SalesID  = S.RateSetID
  JOIN (SELECT G.RegionID
          FROM Region AS G
         WHERE NOT EXISTS
               (SELECT DISTINCT O.RegionID
                  FROM Order AS O
                  JOIN RateSet AS S ON O.OrderID   = S.OrderID
                  JOIN Rate    AS T ON S.RateSetID = T.SalesID
               )
        )           AS K ON O.RegionID = K.RegionID
 WHERE T.RateID IS NULL

架构结构非常不寻常,我不确定这一点 - 但它看起来是正确的。