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

返回MySQL中没有销售的区域的行,mysql,sql,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 NU

我正在尝试创建一个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
上面的查询似乎实现了这一点,但我想再进一步,只返回区域内所有订单都没有费率的订单


非常感谢任何帮助

异常情况-我根本不知道我是否理解为什么在左连接条件中有右连接;这是那种让我的大脑短路的东西

您有4个表:

  • Order-列OrderID、RegionID
  • 区域-列RegionID
  • Rate—列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
模式结构非常不寻常,对此我不确定——但它看起来是正确的