我试图找到每个用户对某个职位都没有的所有技能。
我知道这是不正确的,但我无法想办法让这项工作成功。
这就是我想要做的事情:
select id, count(skillcode)
from person p, (
select skillcode from requires_skill where poscode='1'
minus
select skillcode from hasskill where id=p.id)
group by p.id;
不起作用的部分是 id = p.id 。
我正在使用Oracle SQL。
编辑: 这些是样本表
requires_skill
------------------
poscode | skillcode
-------------------
1 | 2
1 | 3
1 | 4
hasskill
--------------------
id | skillcode
--------------------
1 | 2
2 | 2
2 | 3
预期产出:
id | count(skillcode)
--------------------------
1 | 2
2 | 1
答案 0 :(得分:0)
我认为您需要加入 person
和hasskill
表并使用 NOT EXISTS 而不是 MINUS
类似的东西,
SELECT p.ID,
COUNT(h.skillcode)
FROM person p
JOIN hasskill h
ON p.ID = h.ID
WHERE NOT EXISTS
( SELECT skillcode FROM requires_skill WHERE poscode='1'
)
GROUP BY p.ID;
<强>更新强>
关于 JOIN 的问题,您需要使用 ALIAS 作为子查询。
例如,
WITH DATA AS
( SELECT skillcode FROM requires_skill WHERE poscode='1'
MINUS
SELECT skillcode FROM hasskill h, person p WHERE h.ID=p.ID
)
SELECT p.ID,
COUNT(a.skillcode)
FROM person p
JOIN data A
ON a.skillcode = p.skillcode
GROUP BY p.ID;
答案 1 :(得分:0)
您可以像这样使用标量子查询
select id, (select count(1) from requires_skill) - cnt from (select id, count(1) cnt from hasskill group by id);
只要在requires_skill和hasskill之间存在外键关系,它就可以工作。