一对多,怎么查出最小的,如果不存在多端时用一端数据补齐?
有两个表
表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