是否可以用group by删除一定数量的行?

问题描述 投票:0回答:1

因此,我在一个名为“ Park”的表中有一个名为“ WaterSource”的表。想法是在Park的每一行中说出我拥有多少“ waterSources”并在第二个表中创建该行数。当我将Park的值更改为较小的数字时(例如我有5个,现在我想拥有3个),我需要删除最后2个“ Parks”的“ water source”的“ last”行。

我需要做这样的事情,

 BEGIN
    declare @x int;
    set @x = 1;

    while @x > 0 
    BEGIN
        delete top (@diff) from [WaterSource]
        where [IdView] = @IdView
        order by [Park] DESC;

       set @x = @@ROWCOUNT;                              
    END
END

我不知道如何执行此操作,因为第二个表中的唯一参数是IdView,而我只想按Park Id desc对“ Park”顺序的所有行进行“分组”,并删除所有行。

http://www.sqlfiddle.com/#!9/2cbe3fb/1

所以我的想法是,如果我将公园编号更改为1,则应该将idPark 2的行全部删除,并且还将删除公园2。我总是删除最后一个到第一个。

sql sql-server tsql sql-delete
1个回答
0
投票

基于提供的示例,我假设SQL Server是数据库引擎。我的解决方案的关键是创建一个具有由窗口函数ROW_NUMBER()创建的具有行号或行号列的临时表(有关窗口函数的更多信息,请点击http://www.sqlservertutorial.net/sql-server-window-functions/

DROP TABLE IF EXISTS #ranker
DECLARE @ParkId INT = 2
DECLARE @newNumWaterSources INT = (SELECT numWaterSources FROM Parks WHERE id = @ParkId)

SELECT
ws.id,
ROW_NUMBER() OVER(ORDER BY ws.id) AS rn
INTO #ranker
FROM WaterSources ws
WHERE idPark = @ParkId

DELETE FROM WaterSources
WHERE idPark = @ParkId
AND id IN
(SELECT id FROM #ranker WHERE rn > @newNumWaterSources)

有很多方法可以自动执行此操作,以便为两个变量填充最相关的值。您可能需要使用AFTER UPDATE TRIGGER来进行查询,以查询已删除的表以获取Park表ID。

© www.soinside.com 2019 - 2024. All rights reserved.