Как добиться точного соответствия между идентификаторами с одним общим столбцом?

#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