我需要一个查询来对表1和表2进行选择。我希望它们作为一个常见结果出现,但没有任何连接,表1中没有与表2中的任何值对应的值。因此,如果结果来自table1,则它应包含值table1.a,table1.b, table1.c如果它来自table2,它应该有table2.d,table2.e,table2.f,a,b,c-values为空。
SELECT * FROM table1, table2
...对我没有帮助,因为它总是建立连接,在一个结果中连接table1和table2的结果。我需要将它们分开,每个结果都有自己的行。
简单,困难还是不可能?
答案 0 :(得分:4)
您需要为两个表中的等效列使用相同的别名,例如:
( select a as FIRST_COL
from table 1
)
union
( select d as FIRST_COL
from table2
)
答案 1 :(得分:2)
只要列类型相同,就可以使用union。例如:
select a, b, c
from table1
union
select d, e, f
from table2
如果它们不相同,您仍然可以通过创建“虚拟”列来实现。只要列的类型和数量相同,结果就会显示为一组行。
答案 2 :(得分:2)
如果我理解你的愿望 从table1中选择a,b,c,'','','' 来自table2的联合'','','',e,f,g
用您最喜欢的空位替换''空栏 a,b,c - 列名。
答案 3 :(得分:0)
试试这个:
SELECT * FROM table1 UNION SELECT * FROM table2
答案 4 :(得分:0)
我试图做类似的事情并且对我找到的任何答案都不满意所以我想出了以下的实现。
/* Create Sample Data
*/
declare @a table(a varchar(max))
declare @b table(b varchar(max))
insert @a (a)
values('a1'),('a2'),('a3'),('a4');
insert @b (b)
values('b1'),('b2'),('b3');
/* Show Cartesian Intersection of both tables
*/
select * from @a, @b
/* Create matching table variables with ID column
*/
declare @aIdx table(a varchar(max), Id int identity(1,1))
declare @bIdx table(b varchar(max), Id int identity(1,1))
insert into @aIdx (a)
select a
from @a
insert into @bIdx (b)
select b
from @b
/* Join Record by Record
*/
select
l.Id,
l.a,
r.b
from @aIdx l full outer join @bIdx r on l.Id = r.Id
这两张表的笛卡尔是:
a1 b1
a2 b1
a3 b1
a4 b1
a1 b2
a2 b2
a3 b2
a4 b2
a1 b3
a2 b3
a3 b3
a4 b3
记录加入记录:
1 a1 b1
2 a2 b2
3 a3 b3
4 a4 NULL