重金求SQL(300分)

皮冻

Unregistered / Unconfirmed
GUEST, unregistred user!
A表:F_PZBH,F_YSBH,F_JE,F_JZFX
1001,30001,648.43,D
1001, ,125.03,J
1001,30303, 48.40,D
B表:F_PZNM,F_PZBH,F_JE,F_JZFX
7001,30001,648.43,J
7001,30001,648.43,D
8001,30401, 15.18,D

要求同时满足以下条件
1. A.F_YSBH<>B.F_PZBH or
2. (A.F_YSBH=B.F_PZBH and
A.F_JZFX<>B.F_JZFX and
A.F_JE<>B.F_JE)

A、B表如何关联查询。分别列出A表与B表的不同记录.

期望的结果
A列出
1001, ,125.03,J
1001,30303, 48.40,D
B列出
7001,30001,648.43,D
8001,30401, 15.18,D

急需。谢谢!
 
你的查询后B列出的第一行
7001,30001,648.43,D
不是与给出的条件不符吗?应该是
7001,30001,648.43,J
吧?
 
看不出里面的规律阿??
说说清楚阿
 
首先,要清楚两表的关系及两表相关字段的关系,
其次,我认为这个查询应该用子查询的方式来写,因为特别是第二组条件中的每一个条件
都是前一个条件的结果集的条件结果集。
 
就是想排除A表和B表编号相等并且借贷相反并且金额相等的部分。
 
你看下面这句可以吗?
select a.* from a where f_ysbh is null or f_ysbh not in (select f_pzbh from b)
union
select b.F_PZNM as f_pzbh,b.F_PZBH as f_ysbh,b.F_JE,b.F_JZFX from b where f_pzbh not in (select distinct f_ysbh from a,b where a.f_ysbh=b.f_pzbh)
union
select b.F_PZNM as f_pzbh,b.F_PZBH as f_ysbh,b.F_JE,b.F_JZFX from a,b where b.f_pzbh=a.f_ysbh and a.f_je=b.f_je and a.f_jzfx=b.f_jzfx
union
select a.* from a,b where b.f_pzbh=a.f_ysbh and a.f_je=b.f_je and a.f_jzfx=b.f_jzfx
and f_ysbh not in (select f_pzbh from b)
union
select b.* from a,b where b.f_pzbh=a.f_ysbh and a.f_je=b.f_je and a.f_jzfx=b.f_jzfx
and b.f_pzbh not in (select f_pzbh from a)
 
1、select * from a where a.f_ysbh not in(select distinct f_pzbh from b)
2、select * from b where not EXISTS (select * from a where A.F_YSBH=B.F_PZBH and
A.F_JZFX<>B.F_JZFX and
A.F_JE<>B.F_JE)
 
1、选出要排除的部分,对表A语句应该是
SELECT A.*
FROM [dbo].[A] A, [dbo]. B
WHERE A.F_YSBH = B.F_PZBH AND A.F_JE = B.F_JE AND
A.F_JZFX <> B.F_JZFX
2、然后再从表 A 中排除这一部分
3、对表 B 同理。
4、将对两个表查询的结果 Union 起来。
语句如下(在 SQLServer7 上试过):

SELECT A.*
FROM A,
(SELECT A.*
FROM A, B
WHERE A.F_YSBH = B.F_PZBH AND A.F_JE = B.F_JE
AND A.F_JZFX <> B.F_JZFX) C
WHERE NOT ((A.F_YSBH = C.F_YSBH) AND (A.F_JE = C.F_JE) AND (A.F_JZFX = C.F_JZFX)
AND (A.F_PZBH = C.F_PZBH))
UNION
SELECT B.*
FROM B,
(SELECT B.*
FROM B, A
WHERE A.F_YSBH = B.F_PZBH AND A.F_JE = B.F_JE AND
A.F_JZFX <> B.F_JZFX) C
WHERE NOT ((B.F_PZNM = C.F_PZNM) AND (B.F_JE = C.F_JE) AND
(B.F_JZFX = C.F_JZFX) AND (B.F_PZBH = C.F_PZBH))

这里如果两个表都有主关键字的话,排除时就不用这么麻烦,不需要逐个字段都要比较。
 
我采用了bbkxjy的方法,谢谢大家
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
891
DelphiTeacher的专栏
D
I
回复
0
查看
735
import
I
顶部