sql - 从一对多表返回结果的 SQL 查询
问题描述
我在尝试从结构不佳的一对多表中返回一些数据时遇到困难。
我已经获得了数据导出,其中从“部分代码”开始(在 cat_fullxPath 中)的所有内容都与我的客户数据库中的“技能 ID”相关。
结果先前在一行上返回,但我使用了一个拆分函数将它们分解出来(来自 cat_fullXPath 列)。您可以在最右侧的列中从我的客户数据库中看到相关的“skillID”:
从这里开始,有数以千计的记录可能混合了这些技能 ID(以及许多其他记录,我刚刚提供了这个示例)。我希望能够找到与所有 4 个(或另一个示例中的许多匹配)skillID 匹配的记录,并且仅匹配那些。
例如(我只是碰巧知道这个 ID 给了我想要的结果):
SELECT
id
skillID
FROM table1
WHERE skillID IN ( 1004464, 1006543, 1004605, 1006740 )
AND id = 69580;
这让我回想起:
请注意,这些是该表中唯一的列。
所以这是一个我想归还的ID。
这些是我不想返回的结果,因为缺少其中一个技能 ID:
我创建了一个临时表,其中包含每个 ID 的所有技能的计数,但我不确定此时我是否走在正确的道路上
我很确定有一个简单的解决方案,但是我的头撞到了墙上。希望有人能帮忙!
编辑
这可能是一个更清晰的示例,说明何时需要对齐不同的技能 ID 组。我已经通过 cat_fullxpath 对它们进行了分区,看看这是否让事情变得更清楚:
例如,在此屏幕截图中,我想查找 table1 中所有内容的 ID,其中 SkillID IN (1003914,1005354,1004701) 然后重复 (1004659,1004492,1004493,1004701)。ETC
解决方案
您还没有告诉我们您的 DBMS。这是一个标准的 SQL 方法:
select id
from table1
group by id
having count(case when skillid = 1004464 then 1 end) > 0
and count(case when skillid = 1006543 then 1 end) > 0
and count(case when skillid = 1004605 then 1 end) > 0
and count(case when skillid = 1006740 then 1 end) > 0
and count(case when skillid not in (1004464, 1006543, 1004605, 1006740) then 1 end) = 0;
另一种选择是连接所有技能并查看生成的技能列表是否与所需的技能列表匹配。在 SQL Server 中,字符串聚合函数是STRING_AGG
.
select id
from table1
group by id
having string_agg(skillid, ',') within group (order by skillid) in
(
'1004464,1004605,1006543,1006740'
);
您可以轻松地IN
使用其他组合扩展该子句,甚至可以从另一个表中获取列表。仅确保对字符串中的技能 ID 进行了排序,以使字符串具有可比性('1004464,1004605,1006543,1006740' <> '1006740,1004464,1004605,1006543')。
推荐阅读
- sql - 缩短表名
- c++ - 如何从头开始列出 C++ 中 ZIP 存档的所有文件名?
- javascript - 为什么 await 执行 mongoose 的查询?
- python - autodoc:无法从模块“app_folder”导入模块“路由”
- tensorflow - 前向传递后使用的 KL 损失到底在哪里?
- chef-infra - 在 InSpec 报告中获取版本变量作为输出
- cadence-workflow - 如何从 Cadence 工作流程或活动发出自定义指标?
- java - 如何克服 java.lang.OutOfMemoryError:图像文件在 XML 代码中未在 Activity 中使用的位置。仅在某些设备中出现错误
- rust - 如何为关联常量在 Self 上设置显式生命周期?
- android - 如何使用 Qt 读取 Android 中现有的 SQLite 数据库?