#sql #sql-server-2005
#sql #sql-server-2005
Вопрос:
Мое требование, подобное этому:
Я должен извлечь строку из таблицы «A». Теперь я должен перебрать все строки и получить значения из ID
столбца. Если я получу ID = 5
, то я хочу выполнить некоторую хранимую процедуру, с помощью которой я получу предыдущую строку идентификатора из некоторой таблицы «B». Нравится
select * from table b where ID = 4
Купить мой вопрос: если кто-то удалил эту строку из базы данных (например, какой-то пользователь удалил строки с идентификаторами 3 и 4) — тогда как я могу получить строку с id = 2
из базы данных?
Пожалуйста, дайте мне какую-нибудь хранимую процедуру sql для получения предыдущей записи идентификатора из таблицы.
Комментарии:
1. Вам нужно перестать думать о циклическом просмотре строк. Вы НИКОГДА не перебираете строки, если можете с этим справиться. Научитесь выполнять действия в наборах.
Ответ №1:
Трудно понять, что именно вы ищете — может быть, что-то вроде этого??
CREATE PROCEDURE dbo.FetchPreviousRow @ID INT
AS BEGIN
SELECT TOP 1 ID, (other columns.....)
FROM dbo.TableB
WHERE ID < @ID
ORDER BY ID DESC
END
При этом будет выбрана строка с наибольшим идентификатором, меньшим, чем тот @ID
, который вы передаете, поэтому:
EXEC dbo.FetchPreviousRow @ID = 5
вернет строку с ID = 4
— если она существует. В противном случае он вернет строку с ID = 3
— если она существует. В противном случае строка с ID = 2
— и так далее….
Ответ №2:
Следующий запрос должен получить его для вас:
select max(ID) from YourTable where ID < @YourID
@YourID
является ли переменная, содержащая ваш недавно вставленный идентификатор
Ответ №3:
Как насчет выбора всех идентификаторов меньше 5 и сортировки их по идентификатору. Тогда первым результатом будет тот, который вы хотите.