2010-06-07 58 views
1

我必須寫一個複雜的查詢,但不能弄明白SQL語法複雜的場景(交易)

這裏是我的表

銷售--one行每個售價在對系統進行
SaleProducts --one列在發票的每一行(類似於NW訂單明細)
優惠--a可能的交易清單/提供了銷售可能有權
DealProducts的產品數量--a名單必須購買,以獲得交易

現在我嘗試做一個查詢,這將告訴我的每一個交易出售他可能會得到

相關領域有:

銷售:SaleID(PK)
SaleProducts: SaleID(FK),產品ID(FK)
優惠:DealID(PK)
DealProducts:DealID(FK),產品ID(FK),Mandatories(INT)所需數量

我相信我應該能夠使用某種交叉連接或外連接,但它不是工作

這裏是(約30事情,我試過)一個樣本

SELECT DealProducts.DealID, DealProducts.ProductID, DealProducts.Mandatories, 
     viwSaleProductCount.SaleID, viwSaleProductCount.ProductCount 
FROM DealProducts 
      LEFT OUTER JOIN viwSaleProductCount 
       ON DealProducts.ProductID = viwSaleProductCount.ProductID 
GROUP BY DealProducts.DealID, DealProducts.ProductID, DealProducts.Mandatories, 
     viwSaleProductCount.SaleID, viwSaleProductCount.ProductCount 

的問題在於它沒有顯示任何未完成的產品交易(可能是因爲ProductID加入)。我需要一個銷售也沒有要求顯示出來,那麼我就可以過濾掉存在於這個查詢where AmountBought < Mandatories

謝謝您的幫助

回答

1

我不知道有多好任何SaleID我請按照您的問題(viwSaleProductCount適合哪裏?),但聽起來您會希望外部聯接到子查詢,該子查詢返回交易列表以及相關產品。我認爲它會去是這樣的:

Select * 
From Sales s Inner Join SaleProducts sp on s.SaleID = sp.SaleID 
    Left Join (
     Select * 
     From Deals d Inner Join DealProducts dp on d.DealID = dp.DealId 
    ) as sub on sp.ProductID = sub.ProductID 

您可能需要添加邏輯,以確保交易不會出現兩次了,當然代替*有你需要在所有情況下的具體列名。

編輯:如果你實際上並不需要出售或交易表中的任何信息,像這樣可用於:

Select sp.SaleID, sp.ProductID, sp.ProductCount, dp.DealID, dp.Mandatories 
From SaleProducts sp 
    Left Join DealProducts as dp on sp.ProductID = dp.ProductID 

如果你需要做的這個結果,你的分組/聚集將需要小心以確保交易不會多次計入特定銷售(計數差異可能是適當的,取決於您的分組)。因爲它是一個左連接,所以您無需擔心排除DealProducts中不匹配的銷售。

+0

嗨 感謝您的回答和如此之快! 我相信你的查詢在功能上等同於 SELECT sp.SaleID,sp.ProductID,sp.ProductCount,dp.DealID,dp.ProductID AS Expr1,dp。(選擇SaleID,ProductID,COUNT(SaleProductID)AS ProductCount FROM SaleProducts GROUP BY ProductID,SaleID)AS sp LEFT OUTER JOIN(SELECT DealID,ProductID,Mandatories FROM DealProducts)AS dp ON sp.ProductID = dp.ProductID ill continue在接下來的評論(這些短) – 2010-06-07 14:04:14

+0

他們返回相同數量的行。銷售表和交易表並不真的有我們現在的任何重要信息。所以他們可以被排除在外。現在這仍然有一個缺點。如果我有DealProduct行可以說DealID = 5,ProductID = 7。現在如果一個角蛋白銷售(允許說id = 1)沒有任何SaleProducts with productid = 7,那麼它不會在此查詢中顯示,並且我永遠不會知道該銷售沒有資格處理5 – 2010-06-07 14:08:15

+0

如果您的加入被放入一起合適,然後銷售將顯示和交易信息將爲空。讓我看看我是否可以根據它所顯示的內容拼湊出更新後的查詢。 – AlexCuse 2010-06-07 18:43:22