繁体   English   中英

SQL查询从一个到多个表返回结果

[英]SQL query to return results from one to many table

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

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

结果以前在一行上返回,但我使用了拆分函数来分解这些结果(来自 cat_fullXPath 列)。 您可以在最右侧的列中从我的客户数据库中看到相关的“技能 ID”:

技能ID分解

从这里开始,有数以千计的记录可能混合了这些技能 ID(还有许多其他记录,我刚刚提供了这个示例)。 我希望能够找到与所有 4 个(或来自另一个示例的多个匹配)skillID 匹配的记录,并且仅找到那些。

例如(我刚好知道这个 ID 给了我想要的结果):

SELECT
     id
     skillID
FROM table1
WHERE skillID IN ( 1004464, 1006543, 1004605, 1006740 )
AND id = 69580;

这让我返回:

结果

请注意,这些是该表中唯一的列。

所以这是我想要返回的 ID。

这些是我不想返回的结果,因为缺少其中一个技能 ID:

结果不好

我已经创建了一个临时表,其中包含每个 ID 的所有技能的计数,但我不确定此时我是否走上了正确的道路

数数

我很确定有一个简单的解决方案,但是我的头撞到了墙上。 希望有人能帮忙!

我们知道您正好需要 4 项技能,因此只需创建一个子查询:

select id from 
(
     SELECT
       id
       count(skillID) countSkill
     FROM table1
     WHERE skillID IN ( 1004464, 1006543, 1004605, 1006740 )
     group by id;
)
where countSkill = 4;

可以使用sum而不是count 但不是按4过滤, 40223524022352过滤,这是所有skillID的总和。

您还可以删除子查询并使用HAVING 但是您将获得更差的性能。

     SELECT
       id
       count(skillID) countSkill
     FROM table1
     WHERE skillID IN ( 1004464, 1006543, 1004605, 1006740 )
     group by id
     having count(skillID) = 4;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM