web-dev-qa-db-ja.com

ユニオンクエリからテーブル名を取得しますか?

これは私の質問です

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

正常に動作しています。

今後、それぞれのproductNameのテーブル名をフェッチしたいと思います。

  1. どうすればそれを取得できますか?

私はAS ..を次のように試しました:

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

出力はありませんでした。

  1. クエリを修正し、クエリのパフォーマンスを向上させるにはどうすればよいですか?
8
Prashant Tapase

通常、UNIONを使用していて、特定の行がどのテーブルからのものかを知る必要がある場合は、次のような列に格納されているハードコードされた値を使用します。

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;

これにより、Sourceという新しい列が返され、その行がどのテーブルから来たかを示す識別子が付けられます。

@ypercubeがコメントで示唆しているように、これをUNION ALLに変更することも検討してください。これには重複が含まれますが、それがどのテーブルから来たのかについての識別子もあります。 UNION ALLを使用すると、重複を削除することによるパフォーマンスへの影響が排除されます。

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

これはUNION ALLで試すことができます

おそらく重複するエントリも必要なので、テーブル名を追加すると、一意になり、パフォーマンスも向上します

 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

上記のクエリは行を2回レンダリングしないので、以下のクエリはより適切に機能し、より良いアイデアを提供します。

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

上記のスクリプトは重複するデータ行を与えず、確認します

  1. ソースt1テーブルとしてのt1とt2の間のすべての共通データ。
  2. 非t2行はt1テーブルとしてソースします。
  3. 非t1行はt2テーブルとしてソースします。

t2テーブルの共通データが必要な場合は、左結合を反転します

0
Manoj Kalluri