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

请问: 影响的行数不一样
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