0

我有 5 个表(tbl1、tbl2、tbl3、tbl4、tbl5),它们都有相似的列,但没有共享 fk。我需要按照它们的时间戳(每个表都有的列)的顺序编译一个项目列表。我尝试了以下方法,但没有奏效:

SELECT 
    t1.id, t1.name, t1.created,
    t2.id, t2.name, t2.created,
    t3.id, t3.name, t3.created,
    t4.id, t4.name, t4.created,
    t5.id, t5.name, t5.created
FROM tbl1 t1, tbl2 t2, tbl3 t3, tbl4 t4, tbl5 t5;

显然,上面的内容不会按时间戳列排序,但是在添加“ORDER BY”子句之前,我需要让类似的东西正常工作。

有没有办法(不创建视图)运行从 5 个表返回数据的查询(如果某些表为空,则事件)?

4

2 回答 2

1

听起来您正在寻找的是UNION ALL操作员。

SELECT t1.id, t1.name, t1.created FROM tbl1 t1
 UNION ALL 
SELECT t2.id, t2.name, t2.created FROM tbl2 t2
 UNION ALL 
SELECT t3.id, t3.name, t3.created FROM tbl3 t3
 UNION ALL 
SELECT t4.id, t4.name, t4.created FROM tbl4 t4
 UNION ALL 
SELECT t5.id, t5.name, t5.created FROM tbl5 t5
 ORDER BY 3

UNION ALL运算符基本上将查询的结果连接到一个结果集中。请注意,表达式的数量和每个表达式的数据类型必须在所有查询中匹配。(如果您需要在其中一个查询中包含额外的列,则需要在其他查询中添加相应的表达式(甚至是虚拟占位符)。

当我进行这样的查询时,包含一个表达式(列)有时会很有帮助,它告诉我哪个源查询返回了该行:

SELECT 't1' as source, t1.id, t1.name, t1.created FROM tbl1 t1
 UNION ALL 
SELECT 't2', t2.id, t2.name, t2.created FROM tbl2 t2
 UNION ALL 
SELECT 't3', t3.id, t3.name, t3.created FROM tbl3 t3
 UNION ALL 
SELECT 't4', t4.id, t4.name, t4.created FROM tbl4 t4
 UNION ALL 
SELECT 't5', t5.id, t5.name, t5.created FROM tbl5 t5
 ORDER BY 4

请注意,ORDER BY 适用于整个结果集,您必须引用表达式以按列位置排序。

于 2012-06-20T16:12:54.187 回答
0

使用UNION ALL

SELECT id, name, created FROM tbl1
UNION ALL
SELECT id, name, created FROM tbl2
UNION ALL
SELECT id, name, created FROM tbl3
UNION ALL
SELECT id, name, created FROM tbl4
UNION ALL
SELECT id, name, created FROM tbl5
于 2012-06-20T16:13:14.220 回答