0

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

有什么提示吗?

4

2 回答 2

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'

...
于 2012-07-10T18:42:20.860 回答
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';

并立即执行。

于 2012-07-10T18:34:38.253 回答