2015-12-02 21 views
-2

我試圖找到所有的技能,每個用戶不具有的位置。使用表「作爲」跨加入

我知道這是不正確的,但我不能想辦法,使這項工作。

這就是我想要做的事:

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

顯示一些樣本的數據和預期的輸出? – Buddi

+0

如果您想要一個完美的答案,請創建一個[SQL小提琴](http://sqlfiddle.com/)。或者,發佈所有創建和插入語句。 –

回答

0

我認爲你需要JOINpersonhasskill表和使用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; 

UPDATE

關於你提到的有關問題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; 
+0

這將無法正常工作,請從requires_skill選擇技能代碼,其中poscode ='1'_將返回行,因此查詢將不會返回任何內容。 – carter

+0

因此,您需要將樣本數據作爲創建和插入語句發佈。或者,至少創建一個SQL小提琴, –

+0

@carter關於你提到的有關問題的JOIN,你需要使用的別名子查詢。看到更新。 –

0

您可以使用標量子查詢這樣

select id, (select count(1) from requires_skill) - cnt from (select id, count(1) cnt from hasskill group by id); 

它的工作原理,只要有requires_skill和hasskill之間的外鍵關係船。