显示具有不同行类型的多个查询作为一个结果

时间:2012-07-10 18:30:49

标签: sql postgresql select procedure

在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;这些是不相关的数据。 我不想加入。 我想在屏幕上看到三个结果集。

任何提示?

2 个答案:

答案 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';

立即执行。