![](/img/trans.png)
[英]sql query selecting from two tables - return results from one table if there are none in the other table
[英]SQL query to return results from one to many table
我在尝试从结构不良的一对多表中返回一些数据时遇到了困难。
我得到了一个数据导出,其中从“部分代码”开始(在 cat_fullxPath 中)的所有内容都与我的客户数据库中的“技能 ID”相关。
结果以前在一行上返回,但我使用了拆分函数来分解这些结果(来自 cat_fullXPath 列)。 您可以在最右侧的列中从我的客户数据库中看到相关的“技能 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
过滤, 4022352
按4022352
过滤,这是所有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.