首页 > 解决方案 > 如何在具有共同一列的 Id 之间进行精确匹配?

问题描述

我必须承认我不知道如何正确地提出这个问题,但我会尽力做到最好。

我有两个表(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_promo3 中的 Id_Service 4,则 Promo 3 将具有相同数量的服务和 Promo 1 的相同服务,因此不应允许删除该 Id_Service。如果我从 id_promo3 中删除 Id_Service3,则 Promo 3 将具有与 Promo 2 相同数量的服务和相同服务。但是如果我从 id_promo3 中删除 Id_Service1,则没有其他促销具有相同的服务和相同数量的与之关联的服务,所以它应该允许我删除该寄存器。

我怎样才能验证这一点?如果我想删除一个寄存器,我会在存储过程中获得 ID_DETALED_PROMO 和 ID_PROMO 作为参数。

标签: sqlsql-server

解决方案


我认为这是您可以做的检查,我使用 int 作为 id:

此查询检查每个促销中是否有相同数量的具有相似 id 的 serviceid:

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)

如果您在一个促销 ID 中删除多个服务 ID,您也可以使用多个 serviceId

如果我没记错的话,同样的规则适用于插入和更新,所以同样的查询也可以用于插入/更新。


推荐阅读