从三个表中选择记录并且这些表之间没有关系的SQL查询。其实我想让它成为一个视图。SQL查询从三个表中分别选择记录
假设有三个故事Table1, Table2, Table3
我想说明表1的记录先用一些过滤条件 ,然后将记录从表2 和去年从表3,当我们执行它表明类似的记录的观点像桌子一样。
可以有任意数量的行,但记录必须按此顺序排列。
从三个表中选择记录并且这些表之间没有关系的SQL查询。其实我想让它成为一个视图。SQL查询从三个表中分别选择记录
假设有三个故事Table1, Table2, Table3
我想说明表1的记录先用一些过滤条件 ,然后将记录从表2 和去年从表3,当我们执行它表明类似的记录的观点像桌子一样。
可以有任意数量的行,但记录必须按此顺序排列。
如果你想从每个o的所有记录,我会建议使用UNION ALL而不是联合桌子。 UNION将使用独特的过滤出重复项。如果你不需要这只是减慢查询速度。
进一步的解释在这里: http://wiki.lessthandot.com/index.php/Union_All
要告诉你如何处理时,你不必在每个表中的所有列:
select
1 as seq,col1, col2, col3, cast(null as varchar (40)) as col4
FROM Table1
where ...
UNION ALL
select
2 as seq,'Unknown', col2, null, col4
FROM Table2
where ...
UNION ALL
select
3 as seq ,col1, col2, col3, cast(null as varchar (40)) as col4
FROM Table3
where ...
ORDER BY seq
你可以做这样的事情 - WHERE ID = 34
仅仅是一个样品过滤器:
create view vAllRecords as
select 1 as Rank, Field1, Field2 from Table1 where ID = 34
UNION
select 2 as Rank, Field1, Field2 from Table2
UNION
select 3 as Rank, Field1, Field2 from Table3
采用UNION
将删除任何重复。如果您知道不会有重复项,或者您想查看它们,则查询将以UNION ALL
代替运行得更快。
ORDER BY
不容许的意见,所以你需要通过排名,当你从视图中选择命令:
select *
from vAllRecords
order by Rank
你可以使用UNION查询:
SELECT Field1, Field2, Field3, '1' as Sequence FROM Table1 WHERE SomeCriteria
UNION
SELECT Field7, Field5, Field6, '2' FROM Table2 WHERE SomeCriteria
UNION
SELECT Field4, Field8, Field9, '3' FROM Table3 WHERE SomeCriteria
尝试:
select
1,col1, col2, col3
FROM Table1
where ...
UNION ALL
select
2,col1, col2, col3
FROM Table2
where ...
UNION ALL
select
3,col1, col2, col3
FROM Table3
where ...
ORDER BY 1
请注意,三个查询中的每一个都需要有相同数量的柱ns并且数据类型也应该一致。此外,我使用UNION ALL来加快查询速度,因为没有用途消除三个查询之间的重复项,因为顺序表将保证没有任何问题。
不具有在结果集中尝试顺序列:
SELECT
col1,col2,col3
FROM (select
1 as seq,col1, col2, col3
FROM Table1
where ...
UNION ALL
select
2 as seq,col1, col2, col3
FROM Table2
where ...
UNION ALL
select
3 as seq,col1, col2, col3
FROM Table3
where ...
) dt
ORDER BY seq
如何:
create view AZ_VIEW as
select 1 as orderby, tbl1Col1 as col1, tbl1Col2 as col2, tbl1col3 as col3 from Table1 where criteria1='val'
union
select 2, tbl2Col1, tbl2Col2, tbl2col3 from Table2 where criteria2='anotherval'
union
select 3, tbl3Col1, tbl3Col2, tbl3col3 from Table3 where criteria3='athirdval'
;
如果你的表共享相同的列,您可以使用Union All
:
Select col1, col2, 1 As seq
From table1
Union All
Select col1, col2, 2 As seq
From table1
Union All
Select col1, col2, 3 As seq
From table1
Order By seq
你可以联盟的三个表,照顾以确保他们都返回相同数量的字段。有一个简单的作弊控制顺序(参见下面):
SELECT * FROM ( 选择A,B,C,1作为ListOrder FROM表1 UNION 选择A,B,C,2作为ListOrder FROM表2 UNION 选择A,b,C,3为ListOrder FROM表3 ) ORDER BY ListOrder
什么是三个表的结构? – CResults 2010-04-15 13:47:17
是否有某些原因,您不能仅仅进行3个单独的查询并根据需要将它们呈现给用户/视图? – ewall 2010-04-15 13:48:14
其实列数不一样。 – Azhar 2010-04-15 13:58:26