2016-11-01 185 views
0

我對SQl非常陌生,所以我不確定如何爲谷歌搜索框架我的問題。基本上,我嘗試UNION兩組列。他們有非常相似的信息; Set A是一系列帶有供應商專欄的產品。 B組是一系列沒有供應商的產品。SQL:如何按列過濾聯合

我想要做的是過濾器集A,只有某個供應商的產品是顯示的(這是我對WHERE子句所做的)。但是,接下來,我想要聯合集合A和集合B,這樣集合B中的值將只顯示(和組合)集合A中的產品。

也就是說,爲了更好地解釋,我希望Set B'查看'Set A.它將看到Set A只包含來自某個供應商的物品,然後Set B將刪除Set A沒有的物品(不是來自該供應商的物品)。

有什麼想法?謝謝,下面

代碼:

SELECT ([Transfer_From] 
     ,'Transfer_To' = [WAREHOUSE_CODE] 
     ,'Product_Number' = [PRODUCT_NUMBER] 
     ,'QTY_Trans' = [quantity_received] 
     ,'Transfer_Date' = [received_date] 

    FROM [fstrkdb_1].[dbo].[Inventry] 
    WHERE vendor_number = '1074' 

UNION 

SELECT [Transfer_From] 
     ,[Transfer_To] 
     ,[Product_Number] 
     ,'QTY_Trans' =[Quantity_Allocated] 
     ,[Transfer_Date] 

    FROM [fstrkdb_1].[dbo].[InvtransFromWhs] 


ORDER BY Transfer_Date 

GO 
+0

這是什麼RDBMS(看起來是基於[]使用的SQL Server)這可以通過使用連接的公用表表達式來實現。 – xQbert

+1

您可以提供一些示例數據和預期輸出嗎? – Bohemian

回答

1
WITH DataSet1 as (
SELECT ([Transfer_From] 
     ,'Transfer_To' = [WAREHOUSE_CODE] 
     ,'Product_Number' = [PRODUCT_NUMBER] 
     ,'QTY_Trans' = [quantity_received] 
     ,'Transfer_Date' = [received_date] 

    FROM [fstrkdb_1].[dbo].[Inventry] 
    WHERE vendor_number = '1074'), 
DataSet2 as (

SELECT [Transfer_From] 
     ,[Transfer_To] 
     ,[Product_Number] 
     ,'QTY_Trans' =[Quantity_Allocated] 
     ,[Transfer_Date] 

    FROM [fstrkdb_1].[dbo].[InvtransFromWhs] A 
    INNER JOIN dataset1 B 
    on A.Product_number = B.Product_number) 

SELECT * FROM dataset1 
UNION 
SELECT * FROM dataset2 
ORDER BY Transfer_Date 

這是什麼會做的是生成數據集1。然後使用dataset1中的產品作爲數據集2上的過濾器,然後將這兩個集合在一起。

+0

這對我來說看起來效率很低。據推測,產品可能會在'DataSet1'中重複多次,然後'UNION'會導致額外的開銷來刪除重複項。 –

+0

我希望不同的供應商會有不同的產品編號,但是存在和聯合可能會更有效率。但是不夠了解數據是肯定的。 – xQbert

+0

耶可能最好使用'WHERE A.Product_number IN(SELECT Data_number from DataSet1)' – JamieD77

2

一種方法是在WHERE條款中使用EXISTS。熱膨脹係數有助於避免重蹈第一個查詢:

WITH a as (
     SELECT Transfer_From, WAREHOUSE_CODE as Transfer_To, Product_Number, 
      quantity_received as QTY_Trans, received_date as Transfer_Date 
     FROM [fstrkdb_1].[dbo].[Inventry] 
     WHERE vendor_number = '1074' 
    ) 
SELECT a.* 
FROM a 
UNION ALL 
SELECT Transfer_From, Transfer_To, Product_Number, Quantity_Allocated 
     Transfer_Date 
FROM [fstrkdb_1].[dbo].InvtransFromWhs ifw 
WHERE EXISTS (SELECT 1 FROM a WHERE a.Product_Number = ifw.Product_Number) 
ORDER BY Transfer_Date; 

你只需要UNION如果你期待重複。查詢不應該創建意外的重複項。