Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以从SQL中的一个表中删除单个查询中n行中的多行吗?_Sql_Sql Server - Fatal编程技术网

我可以从SQL中的一个表中删除单个查询中n行中的多行吗?

我可以从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

我想从有数千条记录的表中删除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 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