救命,请教一个SQL语句,请高手进来帮忙,万分谢谢。(100分)

  • 主题发起人 主题发起人 silverwolf
  • 开始时间 开始时间
S

silverwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
假设有两张同样规格的表Table1,Table2
Table1

A B C D
--------------
0 0
1 1
2 0 0

Table2

A B C D
--------------
1 0 1 0
0 2 1 1
0 0 3 1
2 0 0 0


把Table1当做模板,求Table2中匹配的个数。
例如Table2中记录1 A=1 B=0 C=1 D=0 ,就可以匹配Table1中的B=0 D=0
记录3 A=0 B=0 C=3 D=1 ,就无法同Table1任一条记录匹配。

我所指的Table1,Table2是同规格的两张表,它的属性,取值不知,
也有就是说应该适用满足条件的任两张表。该如何实现?
(不要用存储过程实现)
 
一句sql语句绝对无法做到
 
俺菜,不能充分理解你的意思,只匹配两个就行?
select count(a.a) from a,b where a.a=b.a and a.b=b.b and a.c=b.c and a.d=b.d
 
那TABLE2中的记录4(A=2 B=0 C=0 D=0)应该与TABLE1中的记录1匹配还是与记录4匹配?
TABLE1中的空值是代表任意数据吧?
 
估计可以,没有测试过!
select count(*) from TAble1 as T1 , TAble2 as T2
where
(T1.A is not null and T1.A=T2.A) and
(T1.B is not null and T1.B=T2.B) and
(T1.C is not null and T1.A=T2.C) and
(T1.D is not null and T1.D=T2.D)
 
抱歉!!!发现上边有吾!
select count(*) from TAble1 as T1 , TAble2 as T2
where
((T1.A is not null and T1.A=T2.A) or(T1.A is null)) and
((T1.B is not null and T1.B=T2.B) or(T1.A is null)) and
((T1.C is not null and T1.A=T2.C) or(T1.A is null))and
((T1.D is not null and T1.D=T2.D) or(T1.A is null))
 
什么条件匹配什么条件不匹配说清楚点,搞清了问题用游标处理
 
to:Pearl
不限制语句数,关键怎么做到效率较高。.
to:hi_zhb
没错TABLE1中的空值代表任意数据,只要存在匹配就可以,不考虑具体是那个匹配。
to:Fanny501
如果我有n属性,那么算起来,可是一个组合的可能,4k的长度估计不够呀。
to:wangnen,
我说的匹配是指:Talbe1中记录A的空白字符用某一字符替代可
产生Table2中的某一记录B,那么B就成为可被A匹配。
能说说游标怎么实现吗?

谢谢大家帮忙。


 
忘了看(不要用存储过程实现),Sorry
 
declare @ainteger,@binteger,@cinteger,@dinteger,@countflag integer
select sum( @a= case a.a when b.a then 1 else 0 end),
sum( @b= case a.b when b.b then 1 else 0 end),
sum( @c= case a.c when b.c then 1 else 0 end),
sum( @d= case a.d when b.d then 1 else 0 end)
form a,b
go
select @countflag = @a+@b+@c+@d
if @countflag>2 then................
那就要看你的具體標準是什麼了
 
换个思路!不就是字符串匹配问题吗?
首先找两个肯定不会出现在两个表中任何字段的数据中的符号,
假设:“《”和“》”。
我的思路是利用模版来产生一个带有匹配符“%”的字符串,语句:
select (case when a=空 then * else '《'+a+'》' end) +
(case when b=空 then * else '《'+b+'》' end) +
...
from table1
产生的是若干字符串,它们每个都可以作为比较来使用。为了方便,
将上面的结果作为一个view,假设为v1,字段为s1。
好了:
select table2.* from table2,v1
where '《'+a+'》'+'《'+b+'》'+'《'+c+'》'+'《'+d+'》' like v1.s1

嘿,你说“万分感谢”,但你只有100分。

 
to:yeskert1
你的方法很好,但有几个疑问(SQL语句的)
1. then * 为什么不是then '%'?可无论改成什么,用SQLsever自带的
SQL查询都只显示为NULL
2. 按你所说产生的视图V1是这样的吗?:
%《0》% 《0》
% %《1》《1》
《2》《0》% 《0》
可实际上SQLsever自带SQL查询的会显示:
NULL
NULL
NULL
Why?谢谢。
 
j1,j2,j3,j4,count:integer
count:=0
while not table1.eof do
begin
a.value,b.value,c.value,d.value
while not table2.eof do
begin
j1:=0,j2:=0,j3:=0,j4:=0;
a1.value,b1.value,c1.value,d1.value
if a='' then j1:=1
else if a=a1 then j1:=1

if b='' then j2:=1
else if b=b1 then j1:=1;
.
.
.
j4=1;
if j1=1 and j2=1 and j3=1 and j4=1
count:=count+1;
next
end
next
end
 
还是用存储过程实现
 
to:问题雷同,
我要求的方法必须能够对不同的表(满足条件的)都可以适用,……。

to: yeskert1
快来救命呀……
 
A表是固定的吗?如果是
select count(a.a) from a,b where (a.b=b.b and a.d=b.d) or (a.c=b.c and a.d=b.d)
 
to:peleg
我的表不是固定的……。

大家能不能帮解决的对yeskert做法的疑:
1. then * 为什么不是then '%'?可无论改成什么,用SQLsever自带的
SQL查询都只显示为NULL
2. 按你所说产生的视图V1是这样的吗?:
%《0》% 《0》
% %《1》《1》
《2》《0》% 《0》
可实际上SQLsever自带SQL查询只会显示:
NULL
NULL
NULL
Why?谢谢。
 
看来要写一段程序了,先把table1表的中的相同去掉,比如第1、3条记录可以看作为第1条记录!
 
To peleg,
是,我的程序产生的表中不会出现例子的中的情况。1.3条记录会化简为第1条记录
 
后退
顶部