我有两个具有相同结构但数据不同的表。
两者的结构类似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
这个返回两个表中的所有行似乎都很好,但我不知道哪一行属于哪个模式。
如何向他们添加信息以帮助我在查询中识别它?
答案 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)
答案 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
。)