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

Откуда:
Сообщений: 59
Добрый день. Извините за возможно глупый вопрос.
Подскажите решение следующей задачи:

Существует 2 таблицы:

Ord

OrdID Name
1 aaaa
2 ffffff
3 aaaa

OrdDet

OrdID Desc
1 sdfsf
1 sdfsd
2 ffffds
3 hajsd
3 dfdjf

Таблица Ord и OrdDet связаны по OrdID отношением 1:М.

Надо удалить из Ord, записи с name='aaaa', причем не юзать каскадного удаления и не менять структуры бд.

Ограничение ссылочной ссылочной целочтности не даёт удалить записи

DELETE 
FROM Ord 
WHERE Name='aaaa'


На сколько я понимаю надо сначала грохнуть записи из OrdDet, а потом из Ord удалять те записи, которых не стало в OrdDet. А как одним запросом?
20 июн 12, 11:29    [12744225]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
Glory
Member

Откуда:
Сообщений: 104751
juliaSt
А как одним запросом?

Написать его, используя JOIN
20 июн 12, 11:31    [12744247]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
juliaSt
На сколько я понимаю надо сначала грохнуть записи из OrdDet, а потом из Ord удалять те записи, которых не стало в OrdDet. А как одним запросом?
Из двух таблиц удалить записи одной инструкцией DELETE можно,
предварительно создав триггер INSTEAD OF DELETE для Ord
20 июн 12, 11:38    [12744321]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
juliaSt
Member

Откуда:
Сообщений: 59
iap, и такое удаление не затронет структуры бд?
20 июн 12, 11:45    [12744419]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
juliaSt
Member

Откуда:
Сообщений: 59
Glory
juliaSt
А как одним запросом?

Написать его, используя JOIN

Таким образом надо сделать так?

DELETE FROM b
FROM OrdDet a JOIN Ord b
ON a.OrderID=b.OrderID
AND b.Name='aaaa';
20 июн 12, 13:45    [12745602]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
juliaSt
iap, и такое удаление не затронет структуры бд?
Триггер - это часть структуры БД. Как же не затронет-то?!
juliaSt
Таким образом надо сделать так?

DELETE FROM b
FROM OrdDet a JOIN Ord b
ON a.OrderID=b.OrderID
AND b.Name='aaaa';
А из OrdDet кто удалять будет?
20 июн 12, 14:03    [12745789]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
RubinDm
Member

Откуда:
Сообщений: 461
iap
juliaSt
iap, и такое удаление не затронет структуры бд?

Триггер - это часть структуры БД. Как же не затронет-то?!

дык в постановке сказано "... причем не юзать каскадного удаления и не менять структуры бд."
20 июн 12, 14:06    [12745819]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
juliaSt
Member

Откуда:
Сообщений: 59
iap, извините за тупость. Вы правы, как я уже прочла delete только на одну таблицу работает. А как добавить сюда ещё одно удаление - вложенным запросом? Но delete в отличии от select ничего не возвращает.
20 июн 12, 14:07    [12745832]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
Glory
Member

Откуда:
Сообщений: 104751
juliaSt
А как добавить сюда ещё одно удаление - вложенным запросом?

Одна команда DELETE удаляет записи только из одной таблицы
Если вам нужно удалить записи в двух таблицах, то придется писать 2 команды DELETE.
20 июн 12, 14:13    [12745890]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
RubinDm
Member

Откуда:
Сообщений: 461
juliaSt
iap, извините за тупость. Вы правы, как я уже прочла delete только на одну таблицу работает. А как добавить сюда ещё одно удаление - вложенным запросом? Но delete в отличии от select ничего не возвращает.
один delete-запрос может удалять данные только из одной таблицы. Без танцев с тригерами (или иными фичами) Ваша задача не имеет решения.
20 июн 12, 14:14    [12745904]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
juliaSt
Member

Откуда:
Сообщений: 59
так работает! спасибо большущее
DELETE
FROM OrdDet
WHERE OrdID IN (SELECT OrdID FROM Ord WHERE Name='aaaa')
DELETE 
FROM Ord
WHERE OrdID NOT IN(SELECT OrdID FROM OrdDet)
20 июн 12, 14:27    [12746045]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
RubinDm
Member

Откуда:
Сообщений: 461
juliaSt
так работает! спасибо большущее
DELETE FROM Ord WHERE OrdID NOT IN(SELECT OrdID FROM OrdDet)

Так вы удалите не конкретный заказ с name = 'aaaa', а ВСЕ заказы, у которых по каким-либо причинам не окажется спецификации в OrdDet.
20 июн 12, 14:41    [12746192]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
juliaSt
так работает! спасибо большущее
DELETE
FROM OrdDet
WHERE OrdID IN (SELECT OrdID FROM Ord WHERE Name='aaaa')
DELETE 
FROM Ord
WHERE OrdID NOT IN(SELECT OrdID FROM OrdDet)
OrdDet.OrdID может принимать значение NULL?
20 июн 12, 14:45    [12746234]     Ответить | Цитировать Сообщить модератору
 Re: аналог каскадного удаления  [new]
juliaSt
Member

Откуда:
Сообщений: 59
iap,
OrdID не могут быть null
20 июн 12, 14:49    [12746286]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить