BEGIN TRAN
DELETE FROM A
FROM FAC030T A , FAC030T_0925_D B
WHERE A.ACCNT = B.ACCNT
AND A.DEPT_CD = B.DEPT_CD
AND A.COMP_CD = B.COMP_CD
AND A.PNDT1 = B.PNDT1
AND A.PNDT2 = B.PNDT2
AND A.AC_DT = B.AC_DT
AND A.ASL_NO = B.ASL_NO
AND A.ASL_SEQ = B.ASL_SEQ
ROLLBACK TRAN
SELECT A.*
FROM FAC030T A , FAC030T_0925_D B
WHERE A.ACCNT = B.ACCNT
AND A.DEPT_CD = B.DEPT_CD
AND A.COMP_CD = B.COMP_CD
AND A.PNDT1 = B.PNDT1
AND A.PNDT2 = B.PNDT2
AND A.AC_DT = B.AC_DT
AND A.ASL_NO = B.ASL_NO
AND A.ASL_SEQ = B.ASL_SEQ
这两个出现影响的行数不一样 , 请问是什么原因
------解决方案--------------------
因为两个表之间的关系不是一对一,而是一对多或者多对多;而第一个操作删除针对A表,所删除的记录是A表中实际符合条件的记录数。
------解决方案--------------------
delete a 中刪除的是a中滿足條件的數據
而select a.* from a,b 中搜索出來的並不是a中的數據項,而是a,b 鏈接產生的表,
表中可能交叉數據,固影响的行数不一样
------解决方案--------------------
create table A(ID int,Name varchar(20))
insert into A select 1, 'AAAA '
insert into A select 2, 'BBBB '
insert into A select 3, 'CCCC '
insert into A select 4, 'DDDD '
create table B(ID int,A_ID int,Code varchar(20))
insert into B select 1,1, 'XXXX '
insert into B select 2,2, 'XXXX '
insert into B select 3,1, 'XXXX '
insert into B select 4,3, 'XXXX '
insert into B select 4,4, 'XXXX '
insert into B select 4,2, 'XXXX '
insert into B select 4,3, 'XXXX '
go
--因为A/B两表存在一对多的关系,因此在输出的结果集中存在重复的情况
--即A表中ID分别为1/2/3的记录,受影响行数为6
SELECT A.* FROM A,B WHERE A.ID=B.A_ID
/*
ID Name
----------- --------------------
1 AAAA
2 BBBB
1 AAAA
3 CCCC
4 DDDD
2 BBBB
3 CCCC
*/
go
--该SQL语句只删除了A表中的四条记录
DELETE A FROM A,B WHERE A.ID=B.A_ID
go
drop table A,B
go