首页 新闻 会员 周边

请教一sql语句

0
悬赏园豆:10 [已关闭问题]

如下三个表:

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如何实现?

问题补充: 还有一点:要取b表和c表的最大的记录的
MyFavorite的主页 MyFavorite | 初学一级 | 园豆:159
提问于:2009-09-06 23:57
< >
分享
其他回答(4)
0

感觉SQL 实现比较困难,可能需要用程序实现。

eaglet | 园豆:17139 (专家六级) | 2009-09-07 08:01
0

经测试..可以实现

 

Code
邢少 | 园豆:10926 (专家六级) | 2009-09-07 09:39
如果b表的记录大与C表的记录呢?
支持(0) 反对(0) MyFavorite | 园豆:159 (初学一级) | 2009-09-07 10:47
这个我也实现了一下,结果和楼主要求的好像不太一样,所以我就没贴上来。我觉得楼主不是要这个效果。
支持(0) 反对(0) eaglet | 园豆:17139 (专家六级) | 2009-09-07 13:56
@MyFavorite: 其实这个题目我觉得挺矛盾的,没有任何的限制,这样去随意取舍的话.完全动态的话是没有办法实现的。最起码应该有个实现目标,以谁为主. 我的这个其实也就是解决闲着的这种类型数据的情形。
支持(0) 反对(0) 邢少 | 园豆:10926 (专家六级) | 2009-09-07 14:15
0

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    
  两个表的笛卡儿积,返回所有可能的值,不允许有连接条件!  


邀月 | 园豆:25475 (高人七级) | 2009-09-07 09:54
如果b表的记录大与C表的记录呢?
支持(0) 反对(0) MyFavorite | 园豆:159 (初学一级) | 2009-09-07 10:48
0
select c.id,b.ba,b.bb,c.ca,c.cb from c 
left join b on c.id=b.id and ba=ca
                        
嫼、妞 | 园豆:170 (初学一级) | 2009-09-07 10:45
如果b表的记录大与C表的记录呢?
支持(0) 反对(0) MyFavorite | 园豆:159 (初学一级) | 2009-09-07 10:48
0

建议使用全连接 full join来解决

| 园豆:770 (小虾三级) | 2009-09-07 11:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册