2009-12-18 2 views
0

У меня есть таблица с первичным ключом на основе идентификаторов GUID. Мне нужно найти запись в этой таблице на основе первичного ключа, а затем удалить эту запись и всю запись, которая появляется перед ней. Есть ли команда для удаления предыдущих записей или может кто-нибудь дать мне пример SQL о том, как я мог это сделать.Удалите запись и всю предшествующую ей запись

Я использую SLQ сервер 2008

+4

Что вы имеете в виду предшествующими? – Myles

+1

Записи в таблице не имеют порядка (или, более конкретно, у них есть заказ, но это может быть не тот порядок, который вы принимаете.) Вы должны иметь возможность через запрос явно идентифицировать, что, по вашему мнению, «предыдущая запись» быть. Если вы предполагаете, что все строки в таблице полностью случайны, как бы вы запросили найти «предыдущую» строку? – Joe

+0

В таблице также есть поле даты, которое я могу использовать для заказа записей. Если да, можно ли найти запись записи и удалить ее и записи, которые были перед ней (на основе поля даты). Первая запись, которую мне нужно найти, должна основываться на основном ключе GUID. – Retrocoder

ответ

2

В своем вопросе вы заявляете «, которые появляются перед ним.» или "предшествующие записи" Эта концепция должна быть определена более четко. SQL основан на теории множеств - и в наборе нет неявного порядка для элементов в наборе (строки в таблице). Вы должны определить, что означает , предшествующий, на основе значения некоторого атрибута строки ...

1

Поскольку вы используете GUID в качестве первичного ключа, не может быть никакого определения, определенного только из него (если вы не используете NEWSEQUENTIALID(), и даже это будет только последовательным в том же поле до перезапуска), вам нужно другое столбец, например, метку времени или идентификатор, чтобы упорядочить ваши строки.

2

Учитывая природу GUID и тот факт, что вы используете его в качестве первичного ключа, то НЕТ, вы не можете сделать это.

Если у вас есть вторичное поле, которое могло бы помочь с упорядочением тогда Да, или если у вас был IDENTITY поле.

На основании DateColumn указанного:

Посмотрите на этот

DECLARE @Table TABLE(
     ID uniqueidentifier, 
     DateVal DateTime 
) 

INSERT INTO @Table SELECT NEWID(), '06 Jan 2009' 
INSERT INTO @Table SELECT NEWID(), '05 Jan 2009' 
DECLARE @GUID uniqueidentifier 
SELECT @GUID = NEWID() 
INSERT INTO @Table SELECT @GUID, '04 Jan 2009' 
INSERT INTO @Table SELECT NEWID(), '03 Jan 2009' 
INSERT INTO @Table SELECT NEWID(), '02 Jan 2009' 
INSERT INTO @Table SELECT NEWID(), '01 Jan 2009' 

SELECT * 
FROM @Table 

DELETE FROM @Table 
WHERE DateVal <= (SELECT DateVal FROM @Table WHERE ID = @GUID) 

SELECT * 
FROM @Table 
0

Это можно извлечь дату/время из некоторые GUID, в зависимости от того, как они были созданы, однако, как правило, это плохая идея. Как уже упоминалось, вы должны использовать личность или временную метку - это проще, безопаснее и безопаснее.

Соответствующие ссылки:

Смежные вопросы