UNION如何保持识别字段?

时间:2018-01-26 09:13:40

标签: sql postgresql

我有两个具有相同结构但数据不同的表。

两者的结构类似var rqst = (HttpWebRequest)WebRequest.Create(@"http://localhost:9418/Index.aspx"); var rspn = (HttpWebResponse)rqst.GetResponse(); using (StreamReader sr = new StreamReader(rspn.GetResponseStream(),Encoding.UTF8)) Console.WriteLine(sr.ReadToEnd());

我想运行这样的查询:

id, name

这个返回两个表中的所有行似乎都很好,但我不知道哪一行属于哪个模式。

如何向他们添加信息以帮助我在查询中识别它?

4 个答案:

答案 0 :(得分:2)

将计算列添加到select子句:

SELECT *, 1 AS schema_num FROM "schema1"."items"
UNION
SELECT *, 2 FROM "schema2"."items";

您也可以使用此计算列对结果集进行排序,例如如果您希望schema1记录显示在schema2记录之前。

Per Gordon的回答和评论,你可能想在这里使用UNION ALL,除非你真的打算过滤掉重复的内容。

答案 1 :(得分:1)

示例结构:

t=# create schema s1;
CREATE SCHEMA
t=# create schema s2;
CREATE SCHEMA
t=# create table s1.t(i int);
CREATE TABLE
t=# create table s2.t(i int);
CREATE TABLE
t=# insert into s1.t select 1;
INSERT 0 1
t=# insert into s2.t select 1;
INSERT 0 1

选择

t=# select tableoid::regclass,* from s1.t union all select tableoid,* from s2.t;
 tableoid | i
----------+---
 s1.t     | 1
 s2.t     | 1
(2 rows)

tableoidregclass会让它变得整洁

答案 2 :(得分:1)

SELECT a.*, 'table1' AS TABLE_NAME 
FROM "schema1"."items" a
UNION 
SELECT b.*, 'table2' AS TABLE_NAME 
FROM "schema2"."items" b;

所以基本上你在TABLE_NAME列中定义值并联合2个查询。

答案 3 :(得分:1)

该方法是显式包含每个表的表名/标识符。但更重要的是:使用union all而不是union

SELECT i.*, 'schema1' as schema
FROM "schema1"."items" i
UNION ALL
SELECT i2.*, 'schema2'
FROM "schema2"."items" i2;

为什么呢? UNION会产生删除重复项的开销。标识模式的附加列使得无法在两个子查询之间存在重复项。因此,额外的努力被浪费了。 (如果要从每个子查询中删除重复项,请使用SELECT DISTINCT。)