SQL 服务器中 DELETE FROM 的意外结果
Unexpected results for DELETE FROM in SQL Server
我的代码中发生了一些罕见的事情。
检查这个:
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');
出现了我不明白的错误,我必须删除字段“registration”=“n”中的所有行,如您所见,只有 4 条记录的值为“n”出现在现场注册。但是在下面的查询中删除了 8 条记录而不是删除 4 条记录。
代码
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
returns这个:
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 行 - 为什么您甚至需要该子查询?!?!
我的代码中发生了一些罕见的事情。
检查这个:
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');
出现了我不明白的错误,我必须删除字段“registration”=“n”中的所有行,如您所见,只有 4 条记录的值为“n”出现在现场注册。但是在下面的查询中删除了 8 条记录而不是删除 4 条记录。
代码
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
returns这个:
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 行 - 为什么您甚至需要该子查询?!?!