我可以从SQL中的一个表中删除单个查询中n行中的多行吗?
我想从有数千条记录的表中删除4的倍数。我怎么做我可以从SQL中的一个表中删除单个查询中n行中的多行吗?,sql,sql-server,Sql,Sql Server,我想从有数千条记录的表中删除4的倍数。我怎么做 Ex:- Table1 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 我想每四行删除一行 我不想使用循环或光标。试试这个 delete from table_name where (col1 % 4) = 0 使用CTE 输出 rowfield fielda 1 a 2 b 3 c 5 e 6 f 7 g 9 i SQL
Ex:-
Table1
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
我想每四行删除一行
我不想使用循环或光标。试试这个
delete from table_name where (col1 % 4) = 0
使用CTE
输出
rowfield fielda
1 a
2 b
3 c
5 e
6 f
7 g
9 i
SQL Fiddle:
一旦您对输出满意,请使用DELETE FROM。试试这个
DECLARE @nvalToDelete varchar(100)='4,7,3,8,9'-- just give values to delete from table
DECLARE @temp TABLE
(
valtodelete VARCHAR(100)
)
DECLARE @Deletetemp TABLE
(
valtodelete INT
)
INSERT INTO @temp
SELECT @nvalToDelete
INSERT INTO @Deletetemp
SELECT split.a.value('.', 'VARCHAR(1000)') AS valToDelete
FROM (SELECT Cast('<S>' + Replace(valtodelete, ',', '</S><S>')
+ '</S>' AS XML) AS valToDelete
FROM @temp) AS A
CROSS apply valtodelete.nodes('/S') AS Split(a)
DECLARE @Table1 TABLE
(
ID INT,
val varchar(10)
)
INSERT INTO @Table1
SELECT 1,'a' UNION ALL
SELECT 2,'b' UNION ALL
SELECT 3,'c' UNION ALL
SELECT 4,'d' UNION ALL
SELECT 5,'e' UNION ALL
SELECT 6,'f' UNION ALL
SELECT 7,'g' UNION ALL
SELECT 8,'h' UNION ALL
SELECT 9,'i'
SELECT *
FROM @Table1;
WITH cte
AS (SELECT *,
RN = Row_number()
OVER (
ORDER BY id )
FROM @Table1)
DELETE FROM @Table1
WHERE id IN(SELECT id FROM cte
WHERE rn IN (SELECT CASt(valToDelete AS INT) FROM @Deletetemp)
)
SELECT *
FROM @Table1
如果存在并使用索引,则可以使用索引
假设在OP的示例中,第n行作为第一列和第一列中的n值是一个连续的数字序列。它只删除一行,可以删除给定的n值
rowfield fielda
1 a
2 b
3 c
5 e
6 f
7 g
9 i
DECLARE @nvalToDelete varchar(100)='4,7,3,8,9'-- just give values to delete from table
DECLARE @temp TABLE
(
valtodelete VARCHAR(100)
)
DECLARE @Deletetemp TABLE
(
valtodelete INT
)
INSERT INTO @temp
SELECT @nvalToDelete
INSERT INTO @Deletetemp
SELECT split.a.value('.', 'VARCHAR(1000)') AS valToDelete
FROM (SELECT Cast('<S>' + Replace(valtodelete, ',', '</S><S>')
+ '</S>' AS XML) AS valToDelete
FROM @temp) AS A
CROSS apply valtodelete.nodes('/S') AS Split(a)
DECLARE @Table1 TABLE
(
ID INT,
val varchar(10)
)
INSERT INTO @Table1
SELECT 1,'a' UNION ALL
SELECT 2,'b' UNION ALL
SELECT 3,'c' UNION ALL
SELECT 4,'d' UNION ALL
SELECT 5,'e' UNION ALL
SELECT 6,'f' UNION ALL
SELECT 7,'g' UNION ALL
SELECT 8,'h' UNION ALL
SELECT 9,'i'
SELECT *
FROM @Table1;
WITH cte
AS (SELECT *,
RN = Row_number()
OVER (
ORDER BY id )
FROM @Table1)
DELETE FROM @Table1
WHERE id IN(SELECT id FROM cte
WHERE rn IN (SELECT CASt(valToDelete AS INT) FROM @Deletetemp)
)
SELECT *
FROM @Table1
;with cte
as
(select n from numbers
where n%4=0
)
delete t
from table1 t
join
cte c
on c.n=t.id