日期:2014-05-19  浏览次数:20495 次

一对多,怎么查出最小的,如果不存在多端时用一端数据补齐?
有两个表
表A
BASE_ID,BASE_NAME,BASE_PRICE
B1             ,       铅笔,       2.00
B2             ,       钢笔,       23.00
B3             ,   签字笔芯,   2.00    
表B  
ID   ,BASE_ID,   BASE_RPRICE,USER_TYPE
1     ,B1           ,2.00                 ,一级会员
2     ,B1           ,1.50                 ,二级会员
3     ,B2           ,22.50               ,一级会员  
4     ,B2           ,19.90               ,二级会员
5     ,B2           ,19.00               ,三级会员

如何查询得到下面结果?
B1,钢笔,2.00,1.50,二级会员
B2,钢笔,23.00,19.00,三级会员
B3,签字笔芯,2.00,2.00,原价

主要是结果里要得到
B3,签字笔芯,2.00,2.00,原价
这样的结果,不知道怎么才能够替换掉?


------解决方案--------------------
create table A(BASE_ID varchar(10),BASE_NAME varchar(20),BASE_PRICE decimal(10,2))
insert A select 'B1 ', '铅笔 ',2.00
union all select 'B2 ', '钢笔 ',23.00
union all select 'B3 ', '签字笔芯 ',2.00

create table B(ID int,BASE_ID varchar(10),BASE_RPRICE decimal(10,2),USER_TYPE varchar(20))
insert B select 1, 'B1 ',2.00, '一级会员 '
union all select 2, 'B1 ',1.50, '二级会员 '
union all select 3, 'B2 ',22.50, '一级会员 '
union all select 4, 'B2 ',19.90, '二级会员 '
union all select 5, 'B2 ',19.00, '三级会员 '

select aa.BASE_ID,BASE_NAME,aa.BASE_PRICE,isnull(bb.BASE_RPRICE,aa.BASE_PRICE),isnull(bb.USER_TYPE, '原价 ')
from B bb right join A aa
on bb.BASE_ID=aa.BASE_ID
where not exists
(
select 1 from B where BASE_ID=bb.BASE_ID and BASE_RPRICE <bb.BASE_RPRICE
)

drop table A,B

/*
BASE_ID BASE_NAME BASE_PRICE
---------- -------------------- ------------ ------------ --------------------
B1 铅笔 2.00 1.50 二级会员
B2 钢笔 23.00 19.00 三级会员
B3 签字笔芯 2.00 2.00 原价

(所影响的行数为 3 行)
*/
------解决方案--------------------
create table A(BASE_ID nvarchar(10),BASE_NAME nvarchar(10),BASE_PRICE decimal(15,2))
insert A select 'B1 ', '铅笔 ', 2.00
union all select 'B2 ', '钢笔 ', 23.00
union all select 'B3 ', '签字笔芯 ', 2.00

create table B(ID int,BASE_ID nvarchar(10), BASE_RPRICE decimal(15,2),USER_TYPE nvarchar(10))
insert B select 1 , 'B1 ' ,2.00 , '一级会员 '
union all select 2 , 'B1 ' ,1.50 , '二级会员 '
union all select 3 , 'B2 ' ,22.50 , '一级会员 '
union all select 4 , 'B2 ' ,19.90 , '二级会员 '
union all select 5 , 'B2 ' ,19.00 , '三级会员 '


select *,
min_price=isnull((select min(BASE_RPRICE) from B where BASE_ID=tmp.BASE_ID),BASE_PRICE),
USER_TYPE=isnull((select USER_TYPE from B where BASE_ID=tmp.BASE_ID and