2012-08-31 105 views
1

我有這2個查詢,幾乎給我的數據,我需要:加入2個sql查詢並連接結果?

SELECT Products.ItemID, Products.ItemID + '-' + ModifierListItems.ItemID AS SizeItemID 
FROM   ModifierLists INNER JOIN 
         ProductModifierLists ON ModifierLists.ModifierListID = ProductModifierLists.ModifierListID INNER JOIN 
         ModifierListItems ON ModifierLists.ModifierListID = ModifierListItems.ModifierListID INNER JOIN 
         Products ON ProductModifierLists.ItemID = Products.ItemID AND ProductModifierLists.ManufacturerID = Products.ManufacturerID 
WHERE  (Products.ManufacturerID = 262) AND ModifierListName='Size' 
ORDER BY Products.ItemID 

SELECT Products.ItemID, ModifierListItems.ItemID AS ColorItemID 
FROM   ModifierLists INNER JOIN 
         ProductModifierLists ON ModifierLists.ModifierListID = ProductModifierLists.ModifierListID INNER JOIN 
         ModifierListItems ON ModifierLists.ModifierListID = ModifierListItems.ModifierListID INNER JOIN 
         Products ON ProductModifierLists.ItemID = Products.ItemID AND ProductModifierLists.ManufacturerID = Products.ManufacturerID 
WHERE  (Products.ManufacturerID = 262) AND ModifierListName='Color' 
ORDER BY Products.ItemID 

我要找的最終輸出是與ColorItemID級聯的SizeItemID的項目ID加入。

2個查詢樣品結果:

ItemID SizeItemID 
------- ---------- 
A   A-S 
A   A-M 
B   B-M 
B   B-L 

ItemID  ColorItemID 
------- ----------- 
A   BLK 
A   WHT 
B   BLK 
B   WHT 
B   GRN 

我正在尋找的結果將是以下幾點:

FinalItemID 
----------- 
A-S-BLK 
A-S-WHT 
A-M-BLK 
A-M-WHT 
B-M-BLK 
B-M-WHT 
B-M-GRN 
B-L-BLK 
B-L-WHT 
B-L-GRN 
+0

將這兩個查詢作爲ItemID上的派生表加入。如果其中一個查詢包含未在其他一個使用完全外部聯接中找到的id。 –

回答

3

您可以將兩個查詢並將它們一起加入到ItemId中以構造最終值。

在下面的查詢中,我也在表名上使用了別名。許多人發現有意義的別名,更容易比長表名稱改爲:

with tsize as (
    SELECT p.ItemID, 
      p.ItemID + '-' + mli.ItemID AS SizeItemID 
    FROM ModifierLists ml INNER JOIN 
      ProductModifierLists pml 
      ON ml.ModifierListID = pml.ModifierListID INNER JOIN 
      ModifierListItems mli 
      ON ml.ModifierListID = mli.ModifierListID INNER JOIN 
      Products p 
      ON pml.ItemID = Products.ItemID AND 
       pml.ManufacturerID = p.ManufacturerID 
    WHERE (p.ManufacturerID = 262) AND ModifierListName='Size' 
    ), 
    tcolor as (
    SELECT p.ItemID, mli.ItemID AS ColorItemID 
    FROM ModifierLists moli INNER JOIN 
      ProductModifierLists pml 
      ON ml.ModifierListID = pml.ModifierListID INNER JOIN 
      ModifierListItems mli 
      ON ml.ModifierListID = mli.ModifierListID INNER JOIN 
      Products p 
      ON pml.ItemID = Products.ItemID AND 
      pml.ManufacturerID = p.ManufacturerID 
    WHERE  (Products.ManufacturerID = 262) AND ModifierListName='Color' 
    ) 
select SizeItemID+'-'+ColorItemID 
from tsize join tcolor 
    on tsize.itemid = tcolor.ItemID 
+0

猜猜我花了太長時間,但這可以大大簡化,採取第一個查詢,基本上只是增加一行... – CodeRedick

1

試試這個:

你只需要做兩個查詢作爲派生表並加入ItemID

Select a.SizeItemID+'-'+b.ColorItemID as FinalItemID 
FROM 
    (SELECT Products.ItemID, Products.ItemID + '-' + ModifierListItems.ItemID AS SizeItemID 
    FROM   ModifierLists INNER JOIN 
          ProductModifierLists ON ModifierLists.ModifierListID = ProductModifierLists.ModifierListID INNER JOIN 
          ModifierListItems ON ModifierLists.ModifierListID = ModifierListItems.ModifierListID INNER JOIN 
          Products ON ProductModifierLists.ItemID = Products.ItemID AND ProductModifierLists.ManufacturerID = Products.ManufacturerID 
    WHERE  (Products.ManufacturerID = 262) AND ModifierListName='Size' 
    )a 
JOIN 
    (SELECT Products.ItemID, ModifierListItems.ItemID AS ColorItemID 
    FROM   ModifierLists INNER JOIN 
          ProductModifierLists ON ModifierLists.ModifierListID = ProductModifierLists.ModifierListID INNER JOIN 
          ModifierListItems ON ModifierLists.ModifierListID = ModifierListItems.ModifierListID INNER JOIN 
          Products ON ProductModifierLists.ItemID = Products.ItemID AND ProductModifierLists.ManufacturerID = Products.ManufacturerID 
    WHERE  (Products.ManufacturerID = 262) AND ModifierListName='Color' 
    )b 
on a.ItemID=b.ItemID 
ORDER BY a.FinalItemID 
2

好,乾淨尋找的方法是把每個查詢到它自己的看法。它也可以幫助你瞭解你做得更好一點。所以,如果我們採取了查詢和創建意見:

CREATE VIEW v_ProductSize 
AS 
SELECT Products.ItemID, Products.ItemID + '-' + ModifierListItems.ItemID AS SizeItemID 
FROM   ModifierLists INNER JOIN 
         ProductModifierLists ON ModifierLists.ModifierListID = ProductModifierLists.ModifierListID INNER JOIN 
         ModifierListItems ON ModifierLists.ModifierListID = ModifierListItems.ModifierListID INNER JOIN 
         Products ON ProductModifierLists.ItemID = Products.ItemID AND ProductModifierLists.ManufacturerID = Products.ManufacturerID 
WHERE  (Products.ManufacturerID = 262) AND ModifierListName='Size' 
ORDER BY Products.ItemID 


CREATE VIEW v_ProductColor 
AS 
SELECT Products.ItemID, ModifierListItems.ItemID AS ColorItemID 
FROM   ModifierLists INNER JOIN 
         ProductModifierLists ON ModifierLists.ModifierListID = ProductModifierLists.ModifierListID INNER JOIN 
         ModifierListItems ON ModifierLists.ModifierListID = ModifierListItems.ModifierListID INNER JOIN 
         Products ON ProductModifierLists.ItemID = Products.ItemID AND ProductModifierLists.ManufacturerID = Products.ManufacturerID 
WHERE  (Products.ManufacturerID = 262) AND ModifierListName='Color' 
ORDER BY Products.ItemID 

然後,你有兩個簡單的意見,你可以正常使用,對嗎?所以,你的查詢是:

SELECT ps.SizeItemID + ' - ' + pc.ColorItemID FROM v_ProductSize PS JOIN v_ProductColor PC上ps.ItemID = pc.ItemID

見是如何工作的?你只是像做任何其他表一樣進行正常的連接。現在,假設你不想創建視圖,或者由於某種原因沒有權限。你可以跳過視圖部分本身,並使用子查詢。您只是將視圖的引用替換爲括號中的查詢。

因此,這將是這樣的:

SELECT ps.SizeItemID + '-' + pc.ColorItemID 
FROM (
     SELECT Products.ItemID, Products.ItemID + '-' + ModifierListItems.ItemID AS SizeItemID 
     FROM   ModifierLists INNER JOIN 
           ProductModifierLists ON ModifierLists.ModifierListID = ProductModifierLists.ModifierListID INNER JOIN 
           ModifierListItems ON ModifierLists.ModifierListID = ModifierListItems.ModifierListID INNER JOIN 
           Products ON ProductModifierLists.ItemID = Products.ItemID AND ProductModifierLists.ManufacturerID = Products.ManufacturerID 
     WHERE  (Products.ManufacturerID = 262) AND ModifierListName='Size' 
     ORDER BY Products.ItemID 
) ps 
JOIN 
    ( SELECT Products.ItemID, ModifierListItems.ItemID AS ColorItemID 
    FROM   ModifierLists INNER JOIN 
          ProductModifierLists ON ModifierLists.ModifierListID = ProductModifierLists.ModifierListID INNER JOIN 
          ModifierListItems ON ModifierLists.ModifierListID = ModifierListItems.ModifierListID INNER JOIN 
          Products ON ProductModifierLists.ItemID = Products.ItemID AND ProductModifierLists.ManufacturerID = Products.ManufacturerID 
    WHERE  (Products.ManufacturerID = 262) AND ModifierListName='Color' 
    ORDER BY Products.ItemID 
) pc ON ps.itemID=pc.ItemID 

現在...所有的說,用我的咖啡終於踢,可以大大簡化查詢到一個帶有一行修改:

SELECT Products.ItemID, Products.ItemID + '-' + colors.ItemID + '-' + sizes.ItemID AS SizeColorItemID 
FROM   ModifierLists 
INNER JOIN ProductModifierLists ON ModifierLists.ModifierListID = ProductModifierLists.ModifierListID 
INNER JOIN ModifierListItems sizes ON ModifierLists.ModifierListID = ModifierListItems.ModifierListID 
            --Put modifier list name in join clause 
            AND ModifierListName='Size' 
INNER JOIN ModifierListItems colors ON ModifierLists.ModifierListID = ModifierListItems.ModifierListID 
            --same here, but for color 
            AND ModifierListName = 'Color' 
INNER JOIN Products ON ProductModifierLists.ItemID = Products.ItemID 
        AND ProductModifierLists.ManufacturerID = Products.ManufacturerID    
WHERE  (Products.ManufacturerID = 262) --Remove modifierlistitem here so you can use it in the join clauses 
ORDER BY Products.ItemID 

因此,因爲我們真的在兩個原始查詢中提取相同的信息,只有一個不同的條件......我們可以將modifierlistitem.name移動到join子句中,然後再次加入到同一個表中不同的情況。然後我們根據我們使用的條件(大小,顏色)對錶格進行別名。這樣,您可以引用別名並提取正確的項目ID,並將它們一次全部連接起來。