2010-12-16 25 views
0

我正在嘗試創建一個mySql查詢以返回它們沒有分配給它們的速率的訂單列表。目前,我有:在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 

上面的查詢,似乎實現這個,但是我希望把它一步,只返回訂單,其中在該地區的所有訂單不具備的速度。

非常感謝所有幫助

回答

0

異常情況 - 我不能肯定我明白爲什麼你有一個RIGHT JOIN在LEFT JOIN之中的條件;這是使我的大腦短路的事情。

你有4個表:

  • 訂單 - 列的OrderID,RegionID,...
  • 地區 - 列RegionID,...
  • 率 - 列RateID,SalesID,...
  • RateSet - 列RateSetID,訂單ID,...

我們可以猜測,對於表的XyzXyzID列是表的主鍵。我們可以猜測,表中的列參考表Pqr(SalesID除外,其中沒有對應的表銷售 - 但它似乎是連接Rate和RateSet的外鍵(令人費解在該模式不一致)。

這本來是有幫助的提供問題信息。你可能已經有了答案更快的那個樣子,太。

一個給定的順序似乎有一個(可能是幾個)給定名稱,看起來給定的費率集可以有多個費率,包括零,但不清楚是否可以創建沒有任何關聯速率集的訂單,因此我們會保守地認爲它可能會發生。

我不認爲我們需要從地區選擇;訂單表中的RegionID就是足夠的區域標識。以下查詢列出了每個訂單的訂單信息,其中RateSet表中沒有信息或RateSet的費率表中沒有信息。

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 

架構結構具有足夠的不同尋常,我不知道這一點 - 但它看起來正確。

相關問題