Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом нубу  [new]
cammino
Member

Откуда:
Сообщений: 14
Sql Server 2005
Есть две таблицы table1 и table2
в table1 есть дата и ID (есть ещё, но они не нада)
в table2 есть table1_ID (есть ещё, но они не нада) Даты нет.
ID и table1_ID в таблицах одинаковые. То есть запись в таблице table1 с ID = 1, соответствует всем записям из таблицы table2 где table1_ID = 1

Нужен скрипт для удаления записей из обоих таблиц, при условии что их ID одинаковые и они старше 7 дней.
28 июл 09, 11:50    [7467965]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом нубу  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
я знаю только один способ удаления данных из двух таблиц сразу - это когда БД к этому "подготовлена"
например, между этими таблицами есть FK с каскадным удалением
или похожий функционал реализован триггерами...
28 июл 09, 12:08    [7468096]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом нубу  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2549
...а ещё не мешало бы версию сервера, пример тестовых данных, желаемый результат и всё такое...
28 июл 09, 12:19    [7468180]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом нубу  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Паганель
я знаю только один способ удаления данных из двух таблиц сразу - это когда БД к этому "подготовлена"
например, между этими таблицами есть FK с каскадным удалением
или похожий функционал реализован триггерами...
Это уже два способа!
28 июл 09, 12:20    [7468184]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом нубу  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
Паганель
я знаю только один способ удаления данных из двух таблиц сразу - это когда БД к этому "подготовлена"
например, между этими таблицами есть FK с каскадным удалением
или похожий функционал реализован триггерами...
Это уже два способа!
Правда, первый способ - для MSSQL версии >= 8.0
28 июл 09, 12:21    [7468198]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом нубу  [new]
cammino
Member

Откуда:
Сообщений: 14
Паганель

например, между этими таблицами есть FK с каскадным удалением

как узнать?
28 июл 09, 12:55    [7468384]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом нубу  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
cammino
Паганель

например, между этими таблицами есть FK с каскадным удалением
как узнать?
Посмотреть в документации по модели Вашей БД
Если не нашлось, спросить у человека, который БД проектировал
28 июл 09, 12:56    [7468388]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом нубу  [new]
iljy
Member

Откуда:
Сообщений: 8711
cammino,

declare @deldate datetime
set @deldate = dateadd(d, datediff(d,0,getdate()) - 7, 0)
begin tran

delete table2
where table1_ID in (select ID from table1 where date <= @deldate)

delete table1 where date <= @deldate

commit

как-то так. Для поздник версий серверов можно оптимизировать. Но вообще Паганель прав - такие вещи делаются с помощью FK либо триггеров.
28 июл 09, 13:01    [7468409]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом нубу  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
iljy
Но вообще Паганель прав - такие вещи делаются с помощью FK либо триггеров.
Простите, я этого не говорил
Честно говоря, я просто невнимательно прочел, что нужно автору
Я подумал, что ему одним надо запросом, а ему надо одним скриптом
Автор, извините, я не нарочно вам тему зафлудил, случайно получилось
28 июл 09, 13:06    [7468429]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом нубу  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
cammino
Паганель

например, между этими таблицами есть FK с каскадным удалением

как узнать?
Например так:
SELECT LEFT(QUOTENAME(FK.CONSTRAINT_NAME),50)[Foreign Key]
, CAST(QUOTENAME(FK.TABLE_CATALOG)+'.'+QUOTENAME(FK.TABLE_SCHEMA)+'.'+QUOTENAME(FK.TABLE_NAME)+'.'+QUOTENAME(FK.COLUMN_NAME) AS NVARCHAR(530))[поле, которое ссылается]
, CAST(QUOTENAME(PK.TABLE_CATALOG)+'.'+QUOTENAME(PK.TABLE_SCHEMA)+'.'+QUOTENAME(PK.TABLE_NAME)+'.'+QUOTENAME(PK.COLUMN_NAME) AS NVARCHAR(530))[поле, на которое ссылается]
, FK.DELETE_RULE
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE PK
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C ON PK.CONSTRAINT_CATALOG=C.UNIQUE_CONSTRAINT_CATALOG AND PK.CONSTRAINT_SCHEMA=C.UNIQUE_CONSTRAINT_SCHEMA AND PK.CONSTRAINT_NAME=C.UNIQUE_CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE FK ON C.CONSTRAINT_CATALOG=PK.CONSTRAINT_CATALOG AND C.CONSTRAINT_SCHEMA=FK.CONSTRAINT_SCHEMA AND C.CONSTRAINT_NAME=FK.CONSTRAINT_NAME AND PK.ORDINAL_POSITION=FK.ORDINAL_POSITION
WHERE PK.TABLE_NAME=N'ИмяТаблицы'
ORDER BY FK.CONSTRAINT_NAME,PK.ORDINAL_POSITION;
'ИмяТаблицы', естественно, подставьте своё.
Но имейте в виду, что если FK ссылается не на PRIMARY KEY CONSTRAINT и не на UNIQUE CONSTRAINT,
а просто на поля, по которым сделан уникальный индекс, то этот скрипт ничего не покажет.
28 июл 09, 13:11    [7468449]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить