首页 > 解决方案 > 从一对多表返回结果的 SQL 查询

问题描述

我在尝试从结构不佳的一对多表中返回一些数据时遇到困难。

我已经获得了数据导出,其中从“部分代码”开始(在 cat_fullxPath 中)的所有内容都与我的客户数据库中的“技能 ID”相关。

结果先前在一行上返回,但我使用了一个拆分函数将它们分解出来(来自 cat_fullXPath 列)。您可以在最右侧的列中从我的客户数据库中看到相关的“skillID”:

分解的技能 ID

从这里开始,有数以千计的记录可能混合了这些技能 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

在此处输入图像描述

标签: sqlsql-server

解决方案


您还没有告诉我们您的 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')。


推荐阅读