Tabellennamen von Union Query abrufen?

8

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 productNamein Zukunft den Tabellennamen für den jeweiligen abrufen.

  1. Wie kann ich es holen?

Ich habe es 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?
Prashant Tapase
quelle
1
Fügen Sie einfach eine Kennung SELECT hinzu ... bla, 'Tabellenname' FROM t1 und so weiter
Mihai

Antworten:

20

Wenn Sie verwenden UNIONund wissen müssen, aus welcher Tabelle eine bestimmte Zeile stammt, verwenden Sie normalerweise einen fest codierten Wert, der in einer Spalte ähnlich der folgenden 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;

Dadurch wird eine neue Spalte Sourcemit einem Bezeichner zurückgegeben, der angibt, aus welcher Tabelle die Zeile stammt.

Wie @ypercube in den Kommentaren vorgeschlagen hat, möchten Sie möglicherweise auch eine Änderung in a vornehmen. UNION ALLDies beinhaltet ein Duplikat, aber Sie haben auch eine Kennung für die Tabelle, aus der es stammt. Durch die Verwendung von a UNION ALLwerden 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;
Taryn
quelle
@bluefeet: Wie kann ich die Leistung der Abfrage verbessern?
Prashant Tapase
@Prashant Ich vermute, ein Teil Ihres Problems betrifft die UNION. Siehe meine Bearbeitung mit UNION ALL. Die UNION wird Duplikate entfernen, dies führt jedoch zu zusätzlichem Overhead.
Taryn
3

Sie können dies mit versuchen UNION ALL

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
Wählen Sie ID, Produktname, Großbildpfad, Rabatt, Preis, Bild, 'Tablename3' als Tabellenname
FROM Tabellenname3 
wobei Aktiv = 1;
vijayp
quelle
0

Die folgende Abfrage funktioniert besser und gibt Ihnen eine bessere Vorstellung, da die obigen Abfragen Zeilen nicht 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

Manoj Kalluri
quelle