web-dev-qa-db-fra.com

Obtenir le nom de la table à partir de la requête d'union?

Ceci est ma requête

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

Cela fonctionne correctement.

Maintenant, je veux récupérer le nom de la table pour les productName respectifs à l'avenir.

  1. Alors, comment puis-je le récupérer?

J'ai essayé AS .. comme ceci:

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

mais n'a pas obtenu de sortie.

  1. Comment dois-je corriger la requête et également améliorer les performances de la requête?
8
Prashant Tapase

En règle générale, lorsque vous utilisez UNION et que vous devez savoir de quelle table provient une ligne spécifique, vous utilisez une valeur codée en dur stockée dans une colonne similaire à:

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;

Cela renverra une nouvelle colonne appelée Source avec un identifiant qui montre de quelle table provient la ligne.

Comme @ypercube l'a suggéré dans les commentaires, vous pouvez également envisager de le modifier en UNION ALL - cela inclura le doublon mais vous aurez également un identifiant sur la table d'où il vient. Utilisant un UNION ALL éliminera l'impact sur les performances de la suppression des doublons.

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

Vous pouvez essayer ceci avec UNION ALL

comme vous aurez probablement besoin également d'une entrée en double, tout comme l'ajout du nom de table, il sera unique et les performances seront également améliorées

 SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename1' as TableName 
 FROM tablename1 
 Where Active = 1 
 UNION ALL 
 SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename2' as TableName 
 FROM tablename2 
 Where Active = 1 
 UNION ALL 
 SELECT Id, productName, Largeimagepath, Discount, Price, Image, 'Tablename3' as TableName 
 FROM tablename3 
 where Active = 1; 
3
vijayp

la requête ci-dessous fonctionne mieux et vous donne une meilleure idée car les requêtes ci-dessus ne rendent pas les lignes deux fois.

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

le script ci-dessus ne donne pas de lignes de données en double et assurez-vous

  1. Toutes les données communes sont comprises entre t1 et t2 comme table source t1.
  2. Source de lignes non t2 en tant que table t1.
  3. Source de lignes non t1 en tant que table t2.

si vous voulez des données communes de la table t2, retournez la jointure gauche

0
Manoj Kalluri