2016-11-01 4 views
0

私は非常にSQlの新しいですので、私はGoogle検索のために私の質問をフレームする方法がわかりません..基本的に、私はUNION 2列のセットをしようとしています。彼らは非常に似た情報を持っています。セットAは、ベンダー用の列を持つ一連の製品です。セットBは、ベンダーのない一連の製品です。SQL:どのように連合で列をフィルタリングする

私がやりたいことは、特定のベンダーの製品だけが表示されるようなフィルタセットA(WHERE句で行ったことです)です。しかし、Set AとSet Bを結合して、Set Bの値が、その製品のSet 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 

はDATASET1を生成しています。 dataset1の製品をdataset2のフィルタとして使用し、それらの2つのセットを結合します。

+0

これは私にとってかなり非効率的です。おそらく、製品は 'DataSet1'で複数回繰り返され、' UNION'は重複を取り除くための余分なオーバーヘッドを招きます。 –

+0

私は、異なるベンダーが異なる製品番号を持つことを望んでいますが、存在と共用体はすべてより効率的かもしれません。しかし、十分なデータが特定されることはわかっていません。 – xQbert

+0

おそらく、 'WHERE A.Product_number IN(DataSet1からProduct_numberを選択) 'を使用した方が良いでしょう。 – JamieD77

2

WHERE句にEXISTSを使用する方法もあります。 CTEは、最初のクエリの繰り返しを避けることができます:

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を必要としています。クエリは予期しない重複を作成してはいけません。

関連する問題