日期:2014-05-17  浏览次数:20578 次

两表之间的高难度关联查询SQL写法,请大牛出手,解决理解给分!
有两个表关联查询:
表a,字段:web,num
记录如下:
http://xxx.com/1,  10
http://xxx.com/1/2,5
http://xxx.com,    30
http://xxx.com/3/1,10
http://xxx.com/3/2,11
...

表b,字段:name,web,ifok
记录如下:
a,http://xxx.com,  1
b,http://xxx.com/1,0
c,http://xxx.com/3,0
...

希望关联a,b得到结果为:
字段name,num
a,30
b,15
c,21
也就是说表b的记录中ifok为1表示精确匹配表a的记录,ifok为0时模糊匹配表a的记录。

如果表b,字段:name,web,ifok
记录如下:
a,http://xxx.com,  1
b,http://xxx.com/1,1
c,http://xxx.com/3,0
...

那么关联a,b得到结果应该如下:
字段name,num
a,30
b,10
c,21

请教各位大牛,这种既要模糊又要精确的匹配,通过一条SQL语句或是一个存储过程如何实现?
SQL

------解决方案--------------------

select b.name,sum(a.num)
from a,b
where (b.ifok = 1 and a.web = b.web)
  or (b.ifok = 0 and a.web like  b.web 
------解决方案--------------------
 '%')


你试试  这样可以不? 我没有安装Oracle,没有试过 ~~~ 
如果不行的话   将 or的条件拆出来  用 union 链接    这样应该也是算一段SQL吧
------解决方案--------------------
if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
go
create table #temp( [web] varchar(100), [num] int);
insert #temp
select 'http://xxx.com/1','10' union all
select 'http://xxx.com/1/2','5' union all
select 'http://xxx.com','30' union all
select 'http://xxx.com/3/1','10' union all
select 'http://xxx.com/3/2','11' 

if OBJECT_ID('tempdb..#tempB', 'u') is not null   drop table #tempB;
go
create table #tempB( [name] varchar(100), [web] varchar(100), [ifok] bit);
insert #tempB
select 'a','http://xxx.com','1' union all
select 'b','http://xxx.com/1','0' union all
select 'c','http://xxx.com/3','0'