如下三个表:
create table a(id int)
id
1
2
create table b(id int,ba int,bb int)
id ba bb
1 1 1
1 2 2
2 1 1
create table c(id int,ca int,cb int)
id ca cb
1 1 1
1 2 2
1 3 3
2 1 1
想要查出如下结果
id ba bb ca cb
1 1 1 1 1
1 2 2 2 2
1 NULL NULL 3 3
2 1 1 1 1
sql如何实现?
感觉SQL 实现比较困难,可能需要用程序实现。
经测试..可以实现
Code
create table a(id int)
insert into a
select 1 union all
select 2
create table b(id int,ba int,bb int)
insert into b
select 1,1,1 union all
select 1,2,2 union all
select 2,1,1
create table c(id int,ca int,cb int)
insert into c
select 1,1,1 union all
select 1,2,2 union all
select 1,3,3 union all
select 2,1,1
----id ba bb ca cb
----1 1 1 1 1
----1 2 2 2 2
----1 NULL NULL 3 3
----2 1 1 1 1
select * from b
select * from c
select c.id,b.ba,b.bb,c.ca,c.cb from c
left join b on c.id=b.id and ba=ca
id ba bb ca cb
1 1 1 1 1
1 2 2 2 2
1 NULL NULL 3 3
2 1 1 1 1
因为是left join ,条件ba=ca,没有改变,如果只是取两个记录的最大值。
可以测试
declare @bCount int
set @bCount=(select count(*) from b)
declare @cCount int
set @cCount=(select count(*) from c)
if(@bCount<@cCount)
begin
print 'C is max'
select c.id,b.ba,b.bb,c.ca,c.cb from c left join b on c.id=b.id and ba=ca
end
else
begin
print 'B is max'
select b.id,b.ba,b.bb,c.ca,c.cb from b left join c on c.id=b.id and ba=ca
end
另外,full join 会多出记录。不知是否我的测试数据的问题
楼主可以试下:
select c.id,b.ba,b.bb,c.ca,c.cb from c
full join b on c.id=b.id and ba=ca
楼主自己可以尝试下:
Inner Join
Inner Join 把两个表连接在一起,返回两个表中相匹配的记录,是2和3的交集。
Left outer join
Left outer join,左侧表所有的记录都返回,右侧匹配的记录返回,没有匹配的返回Null
Right outer join
与Left outer join相反,右侧的记录返回,左侧返回匹配的记录,没有匹配返回Null
Full outer join
2和3的并集。
Cross join
两个表的笛卡儿积,返回所有可能的值,不允许有连接条件!
select c.id,b.ba,b.bb,c.ca,c.cb from c
left join b on c.id=b.id and ba=ca
建议使用全连接 full join来解决