我有四个包含完全相同列的表,并且想要创建一个包含所有四个的视图,以便我可以一起查询它们。
这可能吗?
(出于乏味的原因,我不能/不允许将它们组合起来,这将使它无关紧要!)
假设除了具有相同的列名之外,相同的列还包含相同的数据,您希望创建一个视图,该视图是所有这些表的联合。
像下面这样的东西应该可以工作,但我的 SQL 生锈了:
(CREATE VIEW view_name AS
(SELECT * FROM table1
UNION
SELECT * FROM table2
UNION
SELECT * FROM table3));
值得注意的是,您可能需要使用“union all”来保留可能存在于多个表中的唯一行。标准联合将删除重复项。
从您的查询中很难判断您是否希望基于 UNION 或作为包含离散列的视图返回数据。这显然是有效果的。
考虑以下示例:
TableA
ID Name RelatedID
1 John 2
2 Paul 1
TableB
ID Name RelatedID
1 Ringo 1
2 George 1
TableC
ID Name RelatedID
1 Bob 1
TableD
ID Name RelatedID
1 Kate NULL
现在,对此运行以下查询:
SELECT ID, Name FROM TableA UNION ALL SELECT ID, Name FROM TableB UNION ALL SELECT ID, Name FROM TableC UNION ALL SELECT ID, Name FROM TableD
这将产生以下输出:
1 John
2 Paul
1 Ringo
2 George
1 Bob
1 Kate
这就是你所追求的吗?如果是这样,则使用 UNION 查询。
现在,如果您想要获得相关数据的离散视图,您可能需要执行以下操作:
SELECT A.ID MasterID, A.Name MasterName,
B.ID BandID, B.Name BandName,
C.ID BlackadderID, C.Name BlackadderName
D.ID BlackadderRealID, D.Name BlackadderRealName
FROM
TableA A
INNER JOIN
TableB B
ON
A.RelatedID = B.ID
INNER JOIN
TableC C
ON
B.RelatedID = C.ID
INNER JOIN
TableD D
ON
C.RelatedID = D.ID
这将导致以下数据视图:
MasterID MasterName BandID BandName BlackAdderID BlackAdderName BlackadderRealID BlackadderRealName
1 John 2 George 1 Bob 1 Kate
2 Paul 1 Ringo 1 Bob 1 Kate
使用联合。 这里是解释
使用联合声明
select * from table1
union
select * from table2
union
select * from table3
如果你联合它们,你可以(我建议包括一些关于每条记录来自哪个表的指标):
select table1.column1, 1 as TableNumber
from table1
union
select table2.column1, 2 as TableNumber
from table2
.. etc ..
不要使用 UNION,而是使用 UNION ALL,除非您特别希望排除重复行。UNION 本身需要更长的时间来执行(因为它会进行查找欺骗的排序),并删除重复的行。