日期:2014-05-16  浏览次数:20464 次

求个sql语句的实现
A表数据如下:
ID selling_shop jbr chexing mark
1 4SQD0066 640217 ACCD-554
2 4SQD0066 610A05 DFBZ-6666
3 4S2J0605 640A92 DFS-978
4 4SQD0076 590A81 CDD-223
5 4SQD0076 640035 TYY-2234
6 4S2J0609 640035 DFBZ-6666
7 4SQD0078 610A05 DFS-978
8 4SQD0078 640217 CDD-223
9 4S2J0703 610017 ACCD-554
10 4S2J0704 610172 DFS-978
B表数据如下:
selling_shop jbr guize
4SQD0065 640A95 BYD-%
4SQD0066 610A05 DFBZ-%
4SQD0076 590A81 %-%
4SQD0077 500A51 %-%
4SQD0078 % %-%
4SQD0079 % %-%

请教大家,可否通过sql语句实现,按照B表中的规则,将符合条件的A表中的mark置为1,条件为:B表中的selling_shop等于A表中的selling_shop;B表中的jbr匹配A表中的jbr,%为模糊匹配;B表中的guize匹配A表中的chexing,%为模糊匹配。

如上例中,执行后的结果应该是A表中ID为2478的这几个mark为1.求教大家,非常感谢!
------解决方案--------------------



--ID selling_shop jbr chexing mark
--selling_shop jbr guize

update tbA a
set a.mark = (case when a.chexing like (case when b.guize = '%-%' then '%' else b.guize end)+'%' then 1 else 0 end)
from tbB b
where a.selling_shop = b.selling_shop and (a.jbr = (case when b.jbr = '%' then a.jbr else b.jbr end))


------解决方案--------------------
;with cte as (
select a.id,a.[selling_shop],a.jbr,a.chexing,CASE WHEN  CHARINDEX(REPLACE(b.[guize],'%',''),a.[chexing] )>0 THEN 1 ELSE 0 END mark
from [A] LEFT JOIN [B] ON (a.[selling_shop]=b.[selling_shop] AND a.[jbr]=b.[jbr] )OR (a.[selling_shop]=b.[selling_shop] AND a.[jbr] LIKE b.[jbr])

)
update a
set a.mark=cte.mark
from cte where a.id=cte.id