2016-11-01 3 views
0

filtern Ich bin sehr neu zu SQL, so dass ich nicht sicher bin, wie ich meine Frage für eine Google-Suche einrahmen soll. Grundsätzlich versuche ich UNION zwei Sätze von Spalten. Sie haben sehr ähnliche Informationen; Set A ist eine Reihe von Produkten mit einer Spalte für den Anbieter. Set B ist eine Serie von Produkten ohne Anbieter.SQL: Wie nach Spalte mit einer Union

Was ich tun möchte, ist Filtersatz A, so dass nur die Produkte eines bestimmten Anbieters angezeigt werden (was ich mit einer WHERE-Klausel gemacht habe). Aber dann möchte ich die Vereinigungsmenge A und die Vereinigungsmenge B so zusammenführen, dass die Werte in Menge B nur dann angezeigt (und kombiniert) werden, wenn in Satz A für das Produkt ein Eintrag vorhanden ist.

Das heißt, um besser zu erklären, möchte ich, dass Set B "Set A" betrachtet. Es wird sehen, dass Set A nur Elemente von einem bestimmten Anbieter hat und Set B dann Elemente entfernen, die Set A nicht hat (Artikel, die NICHT von diesem Anbieter stammen).

Irgendwelche Gedanken? Vielen Dank,

-Code unten:

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

Welcher RDBMS ist das (sieht aus wie SQL Server basierend auf der [] Verwendung) Dies könnte durch einen gemeinsamen Tabellenausdruck mit einem Join möglich sein. – xQbert

+1

Können Sie einige Beispieldaten und die erwartete Ausgabe geben? – Bohemian

Antwort

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 

Was würde dies tun, ist dataset1 zu erzeugen. Verwenden Sie dann die Produkte von Dataset1 als Filter für Dataset2 und vereinigen Sie dann diese beiden Sets.

+0

Das sieht für mich ziemlich ineffizient aus. Vermutlich könnte ein Produkt mehrmals in "DataSet1" wiederholt werden, und dann verursacht die "UNION" zusätzlichen Aufwand zum Entfernen der Duplikate. –

+0

Ich würde hoffen, dass verschiedene Anbieter unterschiedliche Produktnummern haben, aber eine bestehende und Union könnte alle effizienter sein. Nicht genug ist jedoch über die Daten bekannt. – xQbert

+0

yeah wahrscheinlich besser dran mit 'WHERE A.Produktnummer IN (SELECT Produktnummer aus DataSet1)' – JamieD77

2

Eine Möglichkeit ist die Verwendung EXISTS in der WHERE Klausel. Ein CTE hilft zu vermeiden, dass die erste Abfrage zu wiederholen:

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; 

Sie nur UNION benötigen, wenn Sie Duplikate erwarten. Die Abfragen sollten keine unerwarteten Duplikate erstellen.