日期:2014-05-18  浏览次数:20465 次

计算一个表中的记录与其他记录相比较的数量!
有一个表,有字段ID,F1-F9,SUM。F1-F9的值由1,2,3组成。
(为了好理解,本例子中数据只改变了F1,F2的值,其他的字段值不变)
ID F1 F2 F3 F4 F5 F6 F7 F8 F9 SUM
1 1 2 2 3 3 1 2 3 3
2 2 2 2 3 3 1 2 3 3
3 3 2 2 3 3 1 2 3 3
4 3 3 2 3 3 1 2 3 3
5 3 1 2 3 3 1 2 3 3

现计算每一条记录和其他记录字段相同数为8的数量,并将值存到当前记录SUM字段中。
例如:ID1和其他记录比较,与ID2有8个字段相同,与ID3有8个字段相同,与ID4有7个字段相同,
与ID5有7个字段相同,所以8个字段相同的数量为2,记录1的SUM值得到为2;
如此,依次比较ID2和其他记录的数量,依次比较ID3和其他记录的数量,
依次比较ID4和其他记录的数量,依次比较ID5和其他记录的数量.
结果如下表
ID F1 F2 F3 F4 F5 F6 F7 F8 F9 SUM
1 1 2 2 3 3 1 2 3 3 2
2 2 2 2 3 3 1 2 3 3 2
3 3 2 2 3 3 1 2 3 3 4
4 3 3 2 3 3 1 2 3 3 2
5 3 1 2 3 3 1 2 3 3 2

(表中记录数量可能是几万条,所以求运算速度比较快的方法)

------解决方案--------------------
给你一个参考的例子:
http://blog.csdn.net/travylee/article/details/7250969
------解决方案--------------------
SQL code
create table tb(ID int,F1 int,F2 int,F3 int,F4 int,F5 int,F6 int,F7 int,F8 int,F9 int,[SUM] int)
insert into tb values(1 ,1 ,2 ,2 ,3 ,3 ,1 ,2 ,3 ,3 ,null)
insert into tb values(2 ,2 ,2 ,2 ,3 ,3 ,1 ,2 ,3 ,3 ,null)
insert into tb values(3 ,3 ,2 ,2 ,3 ,3 ,1 ,2 ,3 ,3 ,null)
insert into tb values(4 ,3 ,3 ,2 ,3 ,3 ,1 ,2 ,3 ,3 ,null)
insert into tb values(5 ,3 ,1 ,2 ,3 ,3 ,1 ,2 ,3 ,3 ,null)
go

update tb set [sum] = t.cnt from tb ,
(
select m.id , count(1) cnt 
from tb m, tb n where m.id <> n.id and
       (case when m.f1 = n.f1 then 1 else 0 end) +
       (case when m.f2 = n.f2 then 1 else 0 end) +
       (case when m.f3 = n.f3 then 1 else 0 end) +
       (case when m.f4 = n.f4 then 1 else 0 end) +
       (case when m.f5 = n.f5 then 1 else 0 end) +
       (case when m.f6 = n.f6 then 1 else 0 end) +
       (case when m.f7 = n.f7 then 1 else 0 end) +
       (case when m.f8 = n.f8 then 1 else 0 end) +
       (case when m.f9 = n.f9 then 1 else 0 end) = 8
group by m.id
) t
where tb.id = t.id

select * from tb

drop table tb

/*
ID          F1          F2          F3          F4          F5          F6          F7          F8          F9          SUM         
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
1           1           2           2           3           3           1           2           3           3           2
2           2           2           2           3           3           1           2           3           3           2
3           3           2           2           3           3           1           2           3           3           4
4           3           3           2           3           3           1           2           3           3           2
5           3           1           2           3           3           1           2           3           3           2

(所影响的行数为 5 行)
*/