2011-03-17 130 views
1

我有需要進行重構一個SQL查詢。基本上查詢獲取指定客戶訂購的所有產品類型。問題是結果是以列而不是行返回的。這需要改變另一種方式來使查詢更通用。重構SQL查詢返回的結果爲行,而不是列

原來這就是該查詢返回:

Name ProductType1 ProductType2 ProductType3 
-------------------------------------------------- 
Marc PT09   P15   PT33 

,這是它應該是什麼:

Name ProductType 
---------------- 
Marc PT09 
Marc P15 
Marc PT33 

這是我已經簡化了一下查詢:

SELECT 
     CustomerData.Name as Name 
     Product1.productType as ProductType1, 
     Product2.productType as ProductType2, 
     Product3.productType as ProductType3 
FROM 
    (SELECT ProductID, Name 
      FROM 
       Customer 
       Orders 
     WHERE Customer.ID = 111 
    ) as CustomerData 

LEFT JOIN (SELECT DISTINCT CP.ProductID as ProductID, 
          PC.Type as ProductType 
      FROM 
       CustomerProduct CP, 
       ProductCategory PC 
      WHERE 
       PC.Category = 'A' 
       AND CP.ProductCategoryID = PC.ID 
      ) as Product1 
      on CustomerData.ProductID = Product1.ProductID 

LEFT JOIN (SELECT DISTINCT CP.ProductID as ProductID, 
          PC.Type as ProductType 
      FROM 
       CustomerProduct CP, 
       ProductCategory PC 
      WHERE 
       PC.Category = 'B' 
       AND CP.ProductCategoryID = PC.ID 
      ) as Product2 
      on CustomerData.ProductID = Product1.ProductID 

LEFT JOIN (SELECT DISTINCT CP.ProductID as ProductID, 
          PC.Type as ProductType 
      FROM 
       CustomerProduct CP, 
       ProductCategory PC 
      WHERE 
       PC.Category = 'C' 
       AND CP.ProductCategoryID = PC.ID 
      ) as Product3 
      on CustomerData.ProductID = Product1.ProductID 

所以我一直在想分裂加入到一個單獨的存儲過程,然後再調用這個,因爲我需要更多的productTypes,但我似乎無法得到這個工作。任何人有關如何使這項工作的想法?

+0

在你面前已知產品類型的數量正在執行的查詢?如果是這樣,您可以動態創建具有多個UNION的SQL。 – 2011-03-17 10:55:20

回答

3

在做的事情列實際上通常要困難得多。

假設規範化的表客戶,產品和訂單,你不需要做任何事情不僅僅是:

SELECT C.customer_name 
    , P.product_type 
FROM Customers C 
    JOIN Orders O 
    ON O.customer_id=C.customer_id 
    JOIN Products P 
    ON O.product_id=P.product_id 
WHERE C.ID = 111 

如果這不起作用,請列出涉及的表的結構。

+1

+1是的,就是這樣做的。它可能只需要'LEFT JOIN'而不是'JOIN',這取決於他的數據和他想表現的內容。或者,也許一個'GROUP BY'如果客戶有相同產品的不少訂單,你只是希望看到一個行任何的(訂單)的。或者如果他想要在ProductCategory上顯示或過濾,也可以再加入一次。但這是要走的路。再加上查詢看起來簡單而優雅:少於10行代碼而不是40+複雜的4行子查詢。 – 2011-03-17 11:13:40

0

我會假設你的表看起來像這樣

客戶

id | name 
11 | Marc 

產品

id | type 
21 | PT09 
22 | P15 
23 | PT33 

訂單

id | id_customer | id_product | quantity 
31 | 11   | 21   | 4 
32 | 11   | 22   | 6 
33 | 11   | 23   | 8 

那麼你的查詢

SELECT 
    a.name, 
    c.type 
FROM 
    Customer a 
LEFT JOIN 
    Orders b ON b.id_customer = a.id 
LEFT JOIN 
    Products c ON c.id = b.id_product