На основании предоставленного образца я предполагаю, что 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);