возможно удалить определенное количество строк с помощью группы? - PullRequest
0 голосов
/ 17 октября 2019

Итак, у меня есть одна таблица под названием «Парк», а другая - «WaterSource». Идея состоит в том, чтобы в каждой строке Парка сказать, сколько у меня «источников воды», и создать такое количество строк во второй таблице. Когда я изменяю значение парка на младшее число (как у меня было 5, а теперь я хочу иметь 3), мне нужно удалить «последние» строки «источника воды» для последних 2 «парков».

Мне нужно сделать что-то вроде этого,

 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 и удалите все.

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

Так что моя идея состоит в том, что если я изменю номер парка на 1, все строки с idPark 2 должны быть удалены, а парк 2 будетбыть удаленным также. Я всегда удаляю от последнего к первому.

1 Ответ

0 голосов
/ 17 октября 2019

На основании предоставленного образца я предполагаю, что 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, чтобы запросить в удаленной таблице идентификатор таблицы парка.

Это решение будет толькосработает, если столбец id в таблице WaterSources уникален, поэтому вам нужно изменить вставку на WaterSources в скрипте следующим образом:

INSERT INTO WaterSources VALUES (1, 1, 37);
INSERT INTO WaterSources VALUES (2, 1, 37);
INSERT INTO WaterSources VALUES (3, 1, 37);
INSERT INTO WaterSources VALUES (4, 2, 37);
INSERT INTO WaterSources VALUES (5, 2, 37);
INSERT INTO WaterSources VALUES (6, 2, 37);
...