sql - 如何在具有共同一列的 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 作为参数。
解决方案
我认为这是您可以做的检查,我使用 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
如果我没记错的话,同样的规则适用于插入和更新,所以同样的查询也可以用于插入/更新。
推荐阅读
- php - 如何调试 Symfony StreamedResponse?
- python - [可靠]; 使用多个字典
- ajax - 使用 Axios 将某些 XHR 请求优先于其他请求
- java - 如何将api的响应传递给jmeter中的junit请求采样器?
- linux - 映射 /dev/mem 时出现分段错误
- amazon-web-services - 特定区域的 S3 存储桶到另一个特定区域的另一个 S3 存储桶?
- android - 在 Getter/Setter(多维)Arraylist 中使用 IndexOf
- python - 如何将 python 3.6 配置文件转换为 argparser 代码
- .net - 如何使用 PlatformNotSupportedException 解决程序集?
- html - 在按钮上设置宽度 = 100% 时出现问题