在Ubuntu的PostgreSQL 8.3中,我有3个表,比如说T1,T2,T3,它们有不同的模式。 它们中的每一个都包含(一些)与我所知道的ID对象相关的记录。 使用'psql',我经常进行3次操作:
SELECT field-set1 FROM T1 WHERE ID='abc';
SELECT field-set2 FROM T2 WHERE ID='abc';
SELECT field-set3 FROM T3 WHERE ID='abc';
只是看结果;对我来说,这就足够了。
是否可以使用一个参数'id'的过程/函数/宏等, 一个接一个地运行三个SELECTS, 在屏幕上显示结果?
field-set1,field-set2和field-set 3 完全不同。
没有合理的方法来加入表T1,T2,T3;这些是不相关的数据。 我不想加入。 我想在屏幕上看到三个结果集。
任何提示?
答案 0 :(得分:2)
如果行类型(序列中所有列的数据类型)不匹配,UNION
将失败
但是,在PostgreSQL中,您可以将整行投射到其text
表示中:
SELECT t1:text AS whole_row_in_text_representation FROM t1 WHERE id = 'abc'
UNION ALL
SELECT t2::text FROM t2 WHERE id = 'abc'
UNION ALL
SELECT t3::text FROM t3 WHERE id = 'abc';
最后只有一个;
,一个是可选的,只有一个语句。
但还需要更多代码。首先选择包含最多列的表,将每个列转换为文本并为其指定通用名称。为列数较少的其他表添加NULL
值。您甚至可以在表之间插入标题:
SELECT '-t1-'::text AS c1, '---'::text AS c2, '---'::text AS c1 -- table t1
UNION ALL
SELECT '-col1-'::text, '-col2-'::text, '-col3-'::text -- 3 columns
UNION ALL
SELECT col1::text, col2::text, col3::text FROM t1 WHERE id = 'abc'
UNION ALL
SELECT '-t2-'::text, '---'::text, '---'::text -- table t2
UNION ALL
SELECT '-col_a-'::text, '-col_b-'::text, NULL::text -- 2 columns, 1 NULL
UNION ALL
SELECT col_a::text, col_b::text, NULL::text FROM t2 WHERE id = 'abc'
...
答案 1 :(得分:1)
在其间放置一个union all
,并将所有列命名为
SELECT field-set1 as fieldset FROM T1 WHERE ID='abc';
union all
SELECT field-set2 as fieldset FROM T2 WHERE ID='abc';
union all
SELECT field-set3 as fieldset FROM T3 WHERE ID='abc';
立即执行。