2010-04-15 55 views
-1

从三个表中选择记录并且这些表之间没有关系的SQL查询。其实我想让它成为一个视图。SQL查询从三个表中分别选择记录

假设有三个故事Table1, Table2, Table3

我想说明表1的记录先用一些过滤条件 ,然后将记录从表2 和去年从表3,当我们执行它表明类似的记录的观点像桌子一样。

可以有任意数量的行,但记录必须按此顺序排列。

+0

什么是三个表的结构? – CResults 2010-04-15 13:47:17

+0

是否有某些原因,您不能仅仅进行3个单独的查询并根据需要将它们呈现给用户/视图? – ewall 2010-04-15 13:48:14

+0

其实列数不一样。 – Azhar 2010-04-15 13:58:26

回答

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 
+1

但是不能有重复,因为必须有某种指示排序顺序的新列。因此,从第二个或第三个选择匹配记录中获得记录是不可能的。 – MJB 2010-04-15 13:51:11

+0

这就是为什么UNION ALL会更快,因为你不会让系统寻找你没有的副本。 – HLGEM 2010-04-15 13:59:51

0

你可以做这样的事情 - 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 
1

你可以使用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 
2

尝试:

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 
1

如何:

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' 
; 
1

如果你的表共享相同的列,您可以使用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 
1

你可以联盟的三个表,照顾以确保他们都返回相同数量的字段。有一个简单的作弊控制顺序(参见下面):

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