Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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中,当第一行第二列与第二行第一列相同时,如何删除行_Sql - Fatal编程技术网

在sql中,当第一行第二列与第二行第一列相同时,如何删除行

在sql中,当第一行第二列与第二行第一列相同时,如何删除行,sql,Sql,如果第一行的“代码”列等于第二行的“编号”列,而第二行的“代码”列等于第一行的“编号”列,则如何删除行 sql不能使用循环 将此用作示例代码 CREATE TABLE #temp(id int, code int, Number int) Insert into #temp values(1,2,1) Insert into #temp values(2,1,2) Insert into #temp values(3,2,3) Insert into #temp values(4,2,3) I

如果第一行的“代码”列等于第二行的“编号”列,而第二行的“代码”列等于第一行的“编号”列,则如何删除行

sql不能使用循环

将此用作示例代码

CREATE TABLE #temp(id int, code int, Number int)

Insert into #temp values(1,2,1)
Insert into #temp values(2,1,2)
Insert into #temp values(3,2,3)
Insert into #temp values(4,2,3)
Insert into #temp values(5,2,3)

select * from #temp

只需使用联接,即可使用指定的条件获取要删除的行:

delete t1
from #temp t1
inner join #temp t2
    on t1.code = t2.Number and t2.code = t1.Number

只需使用联接,即可使用指定的条件获取要删除的行:

delete t1
from #temp t1
inner join #temp t2
    on t1.code = t2.Number and t2.code = t1.Number
删除t1

从温度t1

哪里有

从温度t2中选择*

其中t1.code=t2.Number和t2.code=t1.Number和t2.Id>t1.Id

删除t1

从温度t1

哪里有

从温度t2中选择*

其中t1.code=t2.Number和t2.code=t1.Number和t2.Id>t1.Id


因为您没有指定正在使用的RDBMS。假设它是SQL Server,则可以执行以下操作:

;WITH CTE
AS
(
   select * , ROW_NUMBER() OVER(ORDER BY ID) rownum
    from temp
), RowsToDelete
AS(
    SELECT c1.*
    FROM CTE c1
    INNER JOIN CTE c2 ON c1.rownum - c2.rownum = 1 AND c1.number = c2.code
)
DELETE r
FROM temp r
WHERE ID IN  ( SELECT ID 
               FROM RowsToDelete);
对于示例数据,这将只删除一行,即:

ID     CODE    NUMBER 
2       1        2     

因为您没有指定正在使用的RDBMS。假设它是SQL Server,则可以执行以下操作:

;WITH CTE
AS
(
   select * , ROW_NUMBER() OVER(ORDER BY ID) rownum
    from temp
), RowsToDelete
AS(
    SELECT c1.*
    FROM CTE c1
    INNER JOIN CTE c2 ON c1.rownum - c2.rownum = 1 AND c1.number = c2.code
)
DELETE r
FROM temp r
WHERE ID IN  ( SELECT ID 
               FROM RowsToDelete);
对于示例数据,这将只删除一行,即:

ID     CODE    NUMBER 
2       1        2     

应用解决方案后,temp中的结果应该是什么样子?应该删除第一行还是第二行?或者两者都应该删除?应该删除第二行,并且我正在使用sql server 2008应用解决方案后,temp中的结果应该是什么样子?应该删除第一行还是第二行?或者应该同时删除这两行?第二行应该删除,我正在使用sql server 2008此命令删除两行内容相似的内容。但是我只需要删除一行…这个命令删除两行。但我只需要删除一行…谢谢。这对我来说真的很有用+20。但是我不能投你的票。。bcz我的名声是o。。所以,通过这个来提高我的声誉questioon@user1001101-不客气。如果你觉得有帮助,或者这里给出的任何其他有帮助的答案,请勾选答案左边的标记。这就是在SO中的工作原理。谢谢。谢谢。这对我来说真的很有用+20。但是我不能投你的票。。bcz我的名声是o。。所以,通过这个来提高我的声誉questioon@user1001101-不客气。如果你觉得有帮助,或者这里给出的任何其他有帮助的答案,请勾选答案左边的标记。这就是在SO中的工作原理。谢谢。这也是我想要的工作方式,但需要比这段代码更多的时间;将CTE设置为select*,按ID rownum从temp排序的行号,将RowsToDelete设置为select c1.*从CTE c1内部将CTE c2连接到c1.rownum-c2.rownum=1和c1.NUMBER=c2.code从temp r中删除r,其中ID在select ID from RowsToDelete中;这也是我想要的,但需要更多的时间比这个代码;将CTE设置为select*,按ID rownum从temp排序的行号,将RowsToDelete设置为select c1.*从CTE c1内部将CTE c2连接到c1.rownum-c2.rownum=1和c1.NUMBER=c2.code从temp r中删除r,其中ID在select ID from RowsToDelete中;