it-swarm.com.de

Tabellennamen von Union Query abrufen?

Das ist meine Frage

SELECT Id, productName, Largeimagepath, Discount, Price, Image FROM tablename1 where Active =1 
union 
SELECT Id, productName, Largeimagepath, Discount, Price, Image FROM tablename2 where Active =1
union  
SELECT Id, productName, Largeimagepath, Discount, Price, Image FROM tablename3 where Active =1

Es funktioniert richtig.

Jetzt möchte ich in Zukunft den Tabellennamen für das jeweilige productName abrufen.

  1. Wie kann ich es holen?

Ich habe versucht AS .. so:

SELECT Id, productName, Largeimagepath, Discount, Price, Image
FROM tablename3 AS tablename
where Active = 1;

wurde aber nicht ausgegeben.

  1. Wie soll ich die Abfrage korrigieren und auch die Leistung der Abfrage verbessern?
8
Prashant Tapase

Wenn Sie UNION verwenden und wissen müssen, aus welcher Tabelle eine bestimmte Zeile stammt, verwenden Sie normalerweise einen fest codierten Wert, der in einer ähnlichen Spalte gespeichert ist:

SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename1' as Source
FROM tablename1 
where Active =1 
union 
SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename2' as Source
FROM tablename2 
where Active =1
union  
SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename3' as Source
FROM tablename3 
where Active =1;

Dies gibt eine neue Spalte mit dem Namen Source mit einem Bezeichner zurück, der angibt, aus welcher Tabelle die Zeile stammt.

Wie @ypercube in den Kommentaren vorgeschlagen hat, können Sie dies auch in UNION ALL Ändern. Dies beinhaltet ein Duplikat, aber Sie haben auch eine Kennung, aus welcher Tabelle es stammt. Durch die Verwendung eines UNION ALL Werden die Auswirkungen des Entfernens von Dups auf die Leistung beseitigt.

SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename1' as Source
FROM tablename1 
where Active =1 
union all
SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename2' as Source
FROM tablename2 
where Active =1
union all
SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename3' as Source
FROM tablename3 
where Active =1;
20
Taryn

Sie können dies mit UNION ALL Versuchen.

da Sie wahrscheinlich auch einen doppelten Eintrag benötigen, wird das Hinzufügen eines Tabellennamens eindeutig sein und die Leistung wird ebenfalls verbessert

 SELECT ID, Produktname, Großbildpfad, Rabatt, Preis, Bild, 'Tablename1' als Tabellenname 
 FROM Tabellenname1 
 Wobei Aktiv = 1 
 UNION ALL 
 SELECT ID, Produktname, Großbildpfad, Rabatt, Preis, Bild, 'Tablename2' als Tabellenname 
 FROM Tabellenname2 
 Wobei Aktiv = 1 
 UNION ALL 
 SELECT ID, Produktname, Großbildpfad, Rabatt, Preis, Bild, 'Tablename3' als Tabellenname 
 VON Tabellenname3 
 wobei Aktiv = 1; 
3
vijayp

die folgende Abfrage funktioniert besser und gibt Ihnen eine bessere Vorstellung, da die obigen Abfragen keine Zeilen zweimal rendern.

SELECT t1.*,t1.table_name
FROM
t1
UNION ALL
SELECT t2.*,t2.table_name
FROM
t2
LEFT OUTER JOIN 
t1
ON t1.id=t2.id
WHERE t1.id=null

das obige Skript gibt keine doppelten Datenzeilen an und stellt sicher

  1. Alle gemeinsamen Daten zwischen t1 und t2 als Quelltabelle t1.
  2. Nicht t2 Zeilen Quelle als t1 Tabelle.
  3. Nicht-t1-Zeilenquelle als t2-Tabelle.

wenn Sie gemeinsame Daten aus der t2-Tabelle wünschen, drehen Sie den Join nach links

0
Manoj Kalluri