2表的复杂sql问题

来源:百度知道 编辑:UC知道 时间:2024/06/19 22:52:57
问题如下:
a表:
aID--a2---a3---a4---a5---a6---a7---金额----标记
-------------------------------------------------
1 a11 a12 a13 a14 a15 a16 a17 a18
2 a21 a22 a23 a24 a25 a26 a27 a28

.........

b表:
aID----名称--b3---b4---b5---数量--b7--金额---标记
-------------------------------------------------------
1 a11 b12 b13 b14 b15 b16 b17 b18
2 a11 b22 b23 b24 b25 b26 b27 b28
........
n a21 b22 b23 b24 b25 -b26 bn7 -b28

说明:表b为表啊的明细,如果b表中的1,2记录为表a中1记录的明细,表b中的n记录为表a中的2记录明细,它们都是销售记录,
b.n记录又是b.2记录的冲账(负数),现在想在b表中b.n记录和与它对应的b.2记录的 标记 列中添加一个数字标记(如1),同时在与b.2记录对应的a.1记录的 标记 列中也添加数字标记=b.n(负数金额),求sql语句!!!!

update b
set b.标记=1
where (selece ??????????
求sql语句!
首先谢谢1楼回答,分析的太对了
我认为还有关联的是b2.数量=bn。数量*(-1);
如果完美的话,还有c表为客户信息表
c表:
id 姓名
-------------------

首先分析一下你的需求
目的:更新表a和表b的标记字段
条件:对于表a,在表b中存在冲账记录的话,将冲账金额写入表a
对于表b,如果自身的冲账记录存在,那么将这一对的标记更新

从数据形式上分析,表a的ID是表b的外键
但是在表b内部,对于能和b.n记录关联的好像只有名称字段。这样的表结构有些不合理。应该加入b.n和b.2能够关联的字段。

根据目前的表结构写出如下SQL,以供参考

1:更新b表
UPDATE b
SET b.标记 = 1
WHERE EXISTS(SELECT * FROM b sub_b
WHERE sub_b.ID <> b.ID
AND sub_b.名称 = b.名称
)

2:更新a表
UPDATE a
SET b.标记 = (SELECT b1.金额 FROM b, b b1
WHERE b.ID = a.ID
AND b.名称 = b1.名称
AND b1.ID <> a.ID
)

补充:数量不能作为关联,因为对于其他的收账来说,完全可能出现相同的数量。数量不能作为确定唯一的标准。只有ID是最保靠的。建议增加[元ID]一类的字段。这样对于冲账记录来说,就知道他是对于哪一个记录的冲账了。