#sql #sql-server
#sql #sql-сервер
Вопрос:
Должен признаться, я понятия не имею, как правильно задать этот вопрос, но я постараюсь сделать все возможное.
У меня есть две таблицы (PROMO и DETAILED_PROMO), которые связаны ключом разветвления (ID_PROMO). Таблицы следующие:
PROMO
--ID_PROMO
--DESCRIPTION
DETAILED_PROMO
--ID_DETAILED_PROMO
--ID_PROMO
--ID_SERVICE
Когда я создаю новую акцию в таблице PROMO, она также создает один или несколько регистров в таблице DETAILED_PROMO с различными службами, связанными с этой акцией. Что-то вроде этого:
--------PROMO----------
ID_PROMO | DESCRIPTION
------------------------
id_promo1 | Promo 1
----------|-------------
id_promo2 | Promo 2
----------| ------------
id_promo3 | Promo 3
-----------DETAILED PROMO----------------------
ID_DETAILED_PROMO | ID_PROMO| ID_SERVICE
-------------------|---------|-----------------
id_detailed_promo1 |id_promo1| Id_Service1
-------------------|---------|-----------------
id_detailed_promo2 |id_promo1| Id_Service2
-------------------|---------|-----------------
id_detailed_promo3 |id_promo1| Id_Service3
-------------------|---------|-----------------
id_detailed_promo4 |id_promo2| Id_Service1
-------------------|---------|-----------------
id_detailed_promo5 |id_promo2| Id_Service2
-------------------|---------|-----------------
id_detailed_promo6 |id_promo2| Id_Service4
-------------------|---------|-----------------
id_detailed_promo7 |id_promo3| Id_Service1
-------------------|---------|-----------------
id_detailed_promo7 |id_promo3| Id_Service2
-------------------|---------|-----------------
id_detailed_promo7 |id_promo3| Id_Service3
-------------------|---------|-----------------
id_detailed_promo7 |id_promo3| Id_Service4
Правила создания или обновления промо-акции заключаются в том, что не может существовать другой промо-акции с точным количеством сервисов и тем же Id_Service.
Например, если я попытаюсь удалить из DETAILED_PROMO Id_Service 4 из id_promo3, Promo 3 будет иметь такое же количество сервисов И те же сервисы, что и Promo 1, поэтому удаление этого Id_Service не должно быть разрешено. Если я удалю Id_Service3 из id_promo3, в Promo 3 будет такое же количество сервисов и те же сервисы, что и в Promo 2. НО если я удалю Id_Service1 из id_promo3, никакие другие промо-акции не будут иметь одинаковых сервисов и такого же количества сервисов, связанных с ним, поэтому это должно позволить мне удалить этот регистр.
Как я могу это проверить? Если я хочу удалить регистр, мне присваиваются ID_DETALED_PROMO и ID_PROMO в качестве параметров в процедуре сохранения.
Комментарии:
1. Для этого вам нужно будет использовать триггер.
2. Какую СУБД вы используете?
3. SQL Management Studio.
Ответ №1:
Я думаю, вот что вы можете сделать для проверки, я использовал int для идентификаторов:
этот запрос проверяет, есть ли одинаковое количество идентификаторов служб с одинаковыми идентификаторами в каждой акции :
DECLARE @ID_promo INT = 3;
DECLARE @Id_Service INT = 4;
SELECT
d1.ID_promo
, COUNT(CASE WHEN d1.ID_Service = d2.ID_Service THEN 1 ELSE NULL END) equalcount
, COUNT(d1.id) totalcount
FROM
detailed_promo d1
LEFT JOIN detailed_promo d2
ON d1.id_Service = d2.Id_service
AND d2.ID_Service NOT IN (@Id_Service)
AND d2.ID_PROMO = @ID_promo
WHERE
d1.id_promo <> @ID_promo
GROUP BY
d1.ID_promo
HAVING
COUNT(CASE WHEN d1.ID_Service = d2.ID_Service THEN 1 ELSE NULL END) = COUNT(d1.id);
итак, если вы хотите удалить проверку, вы можете сделать что-то вроде этого
delete from detailed_promo where id = @ID_promo and id_service= @Id_Service and not exists (queryabove)
вы также можете использовать несколько идентификаторов служб, если удаляете несколько идентификаторов служб в одном промо-идентификаторе
и, если я не ошибаюсь, то же правило применяется для insert и update, поэтому один и тот же запрос можно использовать и для Insert / Update .
Комментарии:
1. Большое вам спасибо. Я собираюсь проверить, работает ли ваш ответ, и я дам вам знать.
2. Я пытаюсь реализовать ваше решение, но у меня есть вопрос. В вашем коде, когда вы пишете только «Id», на какой идентификатор вы ссылаетесь?
3. во втором случае это условие вам не нужно, поскольку я удаляю предложение in where
d1.id_promo <> @ID_promo