查找所有子项完全匹配的父项 ID

2023-12-29

场景

假设我们有一组代表四个关键概念的数据库表:

  1. 实体类型(例如帐户、客户等)
  2. 实体(例如上述实体类型的实例)
  3. 同类群组(命名组)
  4. 群组成员(组成群组成员的实体)

群组的规则是:

  1. 一个队列始终至少有一名队列成员。
  2. 群组成员对于该群组必须是唯一的(即实体 5 不能两次成为群组 3 的成员,但它可以是群组 3 和群组 4 的成员)
  3. 没有两个队列在成员资格上永远不会完全相等,尽管一个队列可以合法地成为另一个队列的子集。

围绕实体的规则是:

  1. 任何两个实体不能具有相同的值对(business_key, entity_type_id)
  2. 两个实体具有不同的entity_type_id可以分享一个business_key

因为图片讲述了一千行代码,所以这是 ERD:


问题

我想要一个 SQL 查询,当提供一组(business_key, entity_type_id)对,将搜索匹配的群组exactly,如果该群组存在,则返回仅包含该群组 ID 的一行,否则返回零行。

即 - 如果实体集匹配entity_ids1和2,它只会返回一个cohort_id哪里的cohort_members正好是 1 和 2,不只是 1,不只是 2,不是一个队列entity_ids1 2 和 3。如果不存在满足此条件的队列,则返回零行。


测试用例

为了帮助人们解决这个问题,我创建了一个表格以及一些定义各种实体类型、实体和群组的数据。还有一个表,里面有测试数据用于匹配,名为test_cohort。它包含 6 个测试组,用于测试各种场景。前 5 次测试应该仅与一个队列完全匹配。第 6 个测试是一个伪造的测试零行子句。使用测试表时,关联INSERT语句应该只有一行未注释(参见小提琴,它最初的设置是这样的):

http://sqlfiddle.com/#!18/2d022 http://sqlfiddle.com/#!18/2d022

我在 SQL 中的尝试如下,尽管它失败了测试 #2 和 #4(可以在 fiddle 中找到):

SELECT actual_cohort_member.cohort_id
FROM test_cohort
INNER JOIN entity
    ON entity.business_key = test_cohort.business_key
    AND entity.entity_type_id = test_cohort.entity_type_id
INNER JOIN cohort_member AS existing_potential_member
    ON existing_potential_member.entity_id = entity.entity_id
INNER JOIN cohort
    ON cohort.cohort_id = existing_potential_member.cohort_id
RIGHT OUTER JOIN cohort_member AS actual_cohort_member
    ON actual_cohort_member.cohort_id = cohort.cohort_id
    AND actual_cohort_member.cohort_id = existing_potential_member.cohort_id
    AND actual_cohort_member.entity_id = existing_potential_member.entity_id
GROUP BY actual_cohort_member.cohort_id
HAVING
    SUM(CASE WHEN
        actual_cohort_member.cohort_id = existing_potential_member.cohort_id AND
        actual_cohort_member.entity_id = existing_potential_member.entity_id THEN 1 ELSE 0
    END) = COUNT(*)
;

这种情况可以通过在中添加复合条件来实现WHERE子句,因为您正在与一对值进行比较。然后你必须根据设置的条件计算结果WHERE子句以及总行数cohort_id.

SELECT  c.cohort_id
FROM    cohort c
        INNER JOIN cohort_member cm
            ON c.cohort_id = cm.cohort_id
        INNER JOIN entity e
            ON cm.entity_id = e.entity_id
WHERE   (e.entity_type_id = 1 AND e.business_key = 'acc1')      -- condition here
         OR (e.entity_type_id = 1 AND e.business_key = 'acc2')
GROUP   BY c.cohort_id
HAVING  COUNT(*) = 2                                            -- number must be the same to the total number of condition
        AND (SELECT COUNT(*) 
             FROM cohort_member cm2 
             WHERE cm2.cohort_id = c.cohort_id) = 2             -- number must be the same to the total number of condition
  • 测试用例 #1 http://sqlfiddle.com/#!18/2e67c/2
  • 测试用例 #2 http://sqlfiddle.com/#!18/2e67c/3
  • 测试用例 #3 http://sqlfiddle.com/#!18/2e67c/4
  • 测试用例#4 http://sqlfiddle.com/#!18/2e67c/5
  • 测试用例 #5 http://sqlfiddle.com/#!18/2e67c/6
  • 测试用例 #6 http://sqlfiddle.com/#!18/2e67c/7

正如您在上面的测试用例中看到的,过滤器中的值取决于条件的数量WHERE条款。建议对此创建动态查询。

UPDATE

如果表test_cohort仅包含一种场景,那么这将满足您的要求,但是,如果test_cohort包含场景列表,那么您可能需要查看其他答案,因为此解决方案不会更改任何表架构。

SELECT  c.cohort_id
FROM    cohort c
        INNER JOIN cohort_member cm
            ON c.cohort_id = cm.cohort_id
        INNER JOIN entity e
            ON cm.entity_id = e.entity_id
        INNER JOIN test_cohort tc
            ON tc.business_key = e.business_key
                AND tc.entity_type_id = e.entity_type_id
GROUP   BY c.cohort_id
HAVING  COUNT(*) = (SELECT COUNT(*) FROM test_cohort)
        AND (SELECT COUNT(*) 
             FROM cohort_member cm2 
             WHERE cm2.cohort_id = c.cohort_id) = (SELECT COUNT(*) FROM test_cohort)
  • 测试用例 #1 http://sqlfiddle.com/#!18/2e67c/8
  • 测试用例 #2 http://sqlfiddle.com/#!18/7dda5/1
  • 测试用例 #3 http://sqlfiddle.com/#!18/361e6/1
  • 测试用例#4 http://sqlfiddle.com/#!18/3b6de/1
  • 测试用例 #5 http://sqlfiddle.com/#!18/62868/1
  • 测试用例 #6 http://sqlfiddle.com/#!18/39008/1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找所有子项完全匹配的父项 ID 的相关文章

  • Oracle SQL——从字符串中删除部分重复项

    我有一个表 其中有一列包含字符串 如下所示 static text here 1abcdefg1abcdefgpxq 从这个字符串1abcdefg重复两次 所以我想删除该部分字符串 然后返回 static text here 1abcdef
  • 如何更新 SQL Server 2000 中的 text 或 ntext 字段

    所以我需要更新一个文本字段 在下面使用时 UPDATE 语句或 WRITETEXT 语句都不起作用 CREATE TABLE MyTable IDField int MyField text INSERT INTO MyTable IDFi
  • 我不确定在 SQL 中声明这些变量时出了什么问题

    我有以下代码 USE pricingdb go CREATE TABLE dbo Events 060107 2012 Date Time varchar 20 COLLATE SQL Latin1 General CP1 CI AS NU
  • 删除原始数据中部分重复的记录

    我需要删除表中时间间隔为 1 或 2 分钟或相同且必须相同的所有记录ID但保留第一个记录 ID Time SN SD WE FW 10 2014 06 30 19 17 37 000 I 0 100 0 10 2014 06 30 19 1
  • Python SQLite3 SQL注入漏洞代码

    我知道下面的代码片段由于 format 的原因很容易受到 SQL 注入的攻击 但我不知道为什么 有谁明白为什么这段代码容易受到攻击以及我从哪里开始修复它 我知道这些代码片段使输入字段保持打开状态 以便通过 SQL 注入执行其他恶意命令 但不
  • Mysql为简单频繁查询创建排序索引性能

    我正在处理一个包含大约 400 万条消息条目的 mysql 表 并尝试根据时间戳选择最新的 50 条消息 另一个要求是返回的消息不以固定前缀开头 问题是单个查询大约占用 25 的 cpu 并且最多需要 1 5 秒 该查询经常由多个客户端执行
  • play20 ebean 生成的 sql 在 postgresql 上抛出语法错误

    我正在尝试使用 postgresql 来启动我的 play20 应用程序 以便我可以使用并稍后部署到 Heroku 我跟着这个answer https stackoverflow com questions 12195568 errors
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 清除表中的所有行将身份规范重置为零并且不影响外键?

    我们已经创建了数据库框架以及所有关系和依赖关系 但表内部只是虚拟数据 我们需要删除这些虚拟数据 并开始添加正确的数据 我们怎样才能清除所有内容并将主键 IsIdentity 是 保留为零 并且不影响外部表关系结构 多谢 您可以采取以下步骤
  • MySQL:你能指定一个随机限制吗?

    有没有办法在 SQL MySQL 中随机化限制数字 我希望能够做的是在查询中获取随机数量的结果以在插入子查询中使用 而无需任何服务器端脚本 我希望能够作为假设说明运行的查询是 SELECT id FROM users ORDER BY RA
  • 如何在SQL Server数据库表列中存储图像[重复]

    这个问题在这里已经有答案了 我有一张名为FEMALE在我的数据库中 它有ID as Primary Key 它有一个Image column 我的问题是如何使用 SQL 查询存储图像 尝试一下 insert into tableName I
  • 仅当变量不为空时 SQL 添加过滤器

    您好 我有疑问如下 SELECT route id ROUTE ID FROM route master NOLOCK WHERE route ou 2 AND route query l s query AND lang id 1 这里
  • 是否可以自动化 SQL Server 2008 分析器?

    有一个post https stackoverflow com questions 488020 what is your most useful sql trick to avoid writing more code关于有用的 SQL
  • Postgresql 中的 id 列位置重要吗?

    我正在测试删除主键列 id 的迁移 我想使用外键作为主键 当我运行并恢复迁移时 我看到表的状态是相同的 只是 id 列现在是最后一个 它会以任何方式改变我的数据库的行为吗 我是否应该费心去恢复迁移恢复代码中的列顺序 理论上一切都应该没问题
  • 在单个更新语句上使用事务

    我在工作中为一些 SP 配音 我发现编写代码的人在单个更新语句上使用了事务 如下所示 begin transaction single update statment update table whatever with whatever
  • 时间分组的 TSQL 滚动平均值

    这是以下内容的后续内容 TSQL 按 N 秒分组 https stackoverflow com questions 5513176 tsql group by n seconds 我得到了我想要的东西 但没有要求正确的东西 如何获得 1
  • t sql中的相对路径?

    如何获取t sql中的相对路径 举个例子 sql文件位于文件夹中D temp 我想获取文件夹中文件hello txt的路径D temp App Data 如何使用相对路径引用 假设我正在 SQL Server Management Stud
  • (SQL) 识别字段中字符串格式多次出现的位置

    我需要将叙述字段 自由文本 拆分为多行 目前的格式如下 Case Reference Narrative XXXX XX 123456 Endless Text up to 50k characters 在作为文本的叙述字段中 各个条目 当
  • ASP.NET 网站上的 XSS 攻击 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我遇到了很大的麻烦 请帮忙 我的网站
  • 从存储过程中的动态 SQL 获取结果

    我正在编写一个存储过程 需要在过程中动态构造 SQL 语句以引用传入的表名称 我需要让这个 SQL 语句返回一个结果 然后我可以在整个过程的其余部分中使用该结果 我尝试过使用临时表和所有内容 但我不断收到一条消息 提示我需要声明变量等 例如

随机推荐

  • WCF WebGet 和 ICollection<>

    我正在尝试从 REST WCF 服务返回通用 ICollection 以下应该可行吗 ServiceContract public class WebConfigurationManager WebGet OperationContract
  • 有什么相对简单的方法来确定一个句子是英语的概率?

    我有许多字符串 字符集合 它们代表不同语言的句子 例如 你好 我叫乔治 Das brot is the gut etc 我想为每个句子分配分数 从 0 1 表明它们是英语句子的可能性 是否有一个公认的算法 或Python库 可以做到这一点
  • Java中删除字符串中的重复行

    我的字符串是 EEE EEE AAA BBB CCC BBB DDD CCC 但我需要这个字符串没有相同的行 像这样 EEE AAA BBB CCC DDD 我该怎么做 这是一个简单的答案 StringBuilder builder new
  • C# 异步任务无限期等待

    我正在尝试使用 异步 和 等待 提供的功能来异步下载网页内容 但我遇到了任务永远等待完成的问题 您能否让我知道以下代码片段有什么问题 protected void Page Load object sender EventArgs e va
  • Python 中的静态数组

    我正在学习如何用 python 编程 同时也在学习理论作为计算机科学课程的一部分 在编程中 我知道我可以通过使用 append 函数向数组添加其他变量 但是在我的理论课程中 我们被告知数组的大小既不能增加也不能减少 这在Python中是如何
  • 我希望我的 pre('save') 猫鼬函数只运行一次

    我不知道标题中的确切要求是否可能 但如果不可能 我真的很感激一个替代解决方案 我有猫鼬的预保存方法 ownerSchema pre save function next const owner this bcrypt genSalt 10
  • 创建对象时出现错误“存在显式转换(是否缺少强制转换)”:

    我有兴趣学习 OOP 概念 在尝试使用继承的简单程序时 我注意到这个错误 我不明白为什么会出现这个错误 我给出了下面简单的 C 代码 class Animal public void Body Console WriteLine Anima
  • *onbeforeunload* 是否在 Safari (macOS) 上缓存?

    我添加了一个事件监听器beforeunload 按照惯例 https developer mozilla org en docs Web API WindowEventHandlers onbeforeunload在我的 JS ReactJ
  • 重新使用现有 Microsoft Identity 用户表时密码(哈希)不匹配

    我们有一个现有的 SQL 数据库微软身份表 最初由 ASP NET Core 应用程序生成 我们还有一个 ASP NET 4 应用程序 它也使用 Microsoft Identity 我们希望 ASP NET 4 应用程序能够使用同一数据库
  • subversion中“让深度粘性”有什么作用?

    我很难找到有关在 SVN 工作副本上使用粘性深度设置的行为的明确文档 在 SVN 中 当使用 更新到修订版本 对话框时 会有一个 使深度粘性 复选框 使深度粘性和非粘性之间有哪些有效区别 当深度为粘性时 您每次更新时都将使用相同的设置进行更
  • PHP以真正的二进制方式读取二进制文件

    我在谷歌上搜索了我的问题 但没有找到解决方案 我想读取一个文件并将缓冲区转换为二进制 例如 10001011001011001 如果我从文件中有这样的东西 bmoov lmvhd tF tF K T trak tkh d tF tF K e
  • Symfony 2:安装并启用 intl 扩展

    我在用着XAMPP for Windows并决定尝试一下Symfony 2 当我到达时Symfony Configuration它建议我安装并启用的页面intl 我尝试阅读PEAR s and PECL s指导 因为我完全0关于这个主题 开
  • std::ostringstream 覆盖初始化字符串

    以下代码会生成 0004567 铿锵 7 https repl it agustinf ostringstream bug or anti feature main cpp include
  • 连接到 Github 时“无法生成 ssh”,但 ssh -T [电子邮件受保护] 有效?

    我很难让 Github Netbeans 正常工作 我想将 ssh 与 git 在 Windows 7 上 结合使用来提交或克隆项目 但我不断收到此错误消息 git clone email protected cdn cgi l email
  • NSOutlineView 缩进问题

    我使用 NSOutlineView 对象来表示文件结构 并发现它不会正确缩进任何可扩展的子项 尽管它会缩进不可扩展的子项 这是一张图片来说明我的意思 在此示例中 AnotherFolder 是 Folder2 的子级 但它没有与其他缩进文件
  • F# 中的代码分析

    作为一名 C 开发人员 我从 Microsoft 的代码分析中受益匪浅 然而 在 F 中 代码分析似乎并不是开发周期的一个组成部分 我花了一段时间才在 F 项目上启用 CA 但这博客有帮助 http blog nikosbaxevanis
  • 将 div 水平和垂直居中,并在调整父级大小时保持居中[重复]

    这个问题在这里已经有答案了 我想始终将 div 水平和垂直居中 我可以减少 增加窗口的宽度 div 将通过始终保持在窗口的中心进行响应 cent height 50px width 50px background color black m
  • 是否可以使用 winmerge 查看 cygwin 的 git diff?

    我喜欢在 cygwin 上使用 git 但唯一的缺点是当我想这样做时git difftool我无法使用任何有用的东西 git diff大多数时候对我来说很好 但有时我想使用 winmerge 通过以下方式查看这些差异git difftool
  • 想要将特定的 div 向右移动

    我想将特定的 div 移到右侧 以便左侧的 div 获得更多空间来显示其中的内容 我在 CSS 中尝试了一些东西 但我知道我做错了 在 CSS 中 我 login box width 200px margin left 50px 您可以在该
  • 查找所有子项完全匹配的父项 ID

    场景 假设我们有一组代表四个关键概念的数据库表 实体类型 例如帐户 客户等 实体 例如上述实体类型的实例 同类群组 命名组 群组成员 组成群组成员的实体 群组的规则是 一个队列始终至少有一名队列成员 群组成员对于该群组必须是唯一的 即实体