使用表'作为'跨加入

时间:2015-12-02 05:00:50

标签: sql oracle

我试图找到每个用户对某个职位都没有的所有技能。

我知道这是不正确的,但我无法想办法让这项工作成功。

这就是我想要做的事情:

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

2 个答案:

答案 0 :(得分:0)

我认为您需要加入 personhasskill表并使用 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之间存在外键关系,它就可以工作。