SQL Server中DELETE FROM出现意外结果



在我的代码中发生了一些罕见的事情。

检查此项:

if object_id('inscriptos') is not null
drop table inscriptos;
if object_id('socios') is not null
drop table socios;
create table socios
(
numero int identity,
documento char(8),
nombre varchar(30),
domicilio varchar(30),
primary key (numero)
);
create table inscriptos 
(
numerosocio int not null,
deporte varchar(20) not null,
matricula char(1),-- 'n' o 's'
primary key(numerosocio, deporte),
constraint FK_inscriptos_socio
foreign key (numerosocio) references socios(numero)
);
GO

insert into socios values('23333333', 'Alberto Paredes', 'Colon 111');
insert into socios values('24444444', 'Carlos Conte', 'Sarmiento 755');
insert into socios values('25555555', 'Fabian Fuentes', 'Caseros 987');
insert into socios values('26666666', 'Hector Lopez', 'Sucre 344');
insert into inscriptos values(1, 'tenis', 's');
insert into inscriptos values(1, 'basquet', 's');
insert into inscriptos values(1, 'natacion', 's');
insert into inscriptos values(2, 'tenis', 's');
insert into inscriptos values(2, 'natacion', 's');
insert into inscriptos values(2, 'basquet', 'n');
insert into inscriptos values(2, 'futbol', 'n');
insert into inscriptos values(3, 'tenis', 's');
insert into inscriptos values(3, 'basquet', 's');
insert into inscriptos values(3, 'natacion', 'n');
insert into inscriptos values(4, 'basquet', 'n');

这里出现了一个我不理解的错误,我必须删除字段"中的所有行;注册"="n〃;,正如你所看到的,只有4条记录的值";n〃;出现在字段注册中。但是在下面的查询中删除了8个RECORDS,而不是删除4个RECORD。

代码

DELETE FROM inscriptos 
WHERE numerosocio IN (SELECT s.numero 
FROM socios AS s 
JOIN inscriptos AS i ON (i.numerosocio = s.numero)
WHERE i.matricula = 'n');

你知道为什么会发生这种事吗?我真的不能理解

谢谢!

您的内部SELECT返回以下内容:

numero
------
2
2
3
4

所以你的DELETE变成

DELETE FROM inscriptos 
WHERE numerosocio IN (2, 3, 4)

如果您检查哪些行符合该条件:

SELECT * FROM inscriptos 
WHERE numerosocio IN (2, 3, 4)

您得到的结果-8行-这些行将被删除:

numerosocio   deporte   matricula
-----------------------------------
2         basquet       n
2         futbol        n
2         natacion      s
2         tenis         s
3         basquet       s
3         natacion      n
3         tenis         s
4         basquet       n

那么,您想要删除哪些??

这个怎么样:

DELETE FROM inscriptos 
WHERE matricula = 'n'

这将删除具有matricula = 'n'的那4行-为什么您甚至需要该子查询?!?!

最新更新