2015-05-10 60 views
0

我嘗試使用(union/intersect/minus)來計算主鍵ACNUM在這些表內的次數有點困難。Oracle數據庫設置運算符來統計重複字段

我試過使用SET運算符的多種方式,但似乎無法弄清楚。

即使這樣的事情似乎並沒有工作:

SELECT results.ACNUM, COUNT(results.books), COUNT(results.interests) 
FROM (
SELECT ACNUM FROM ACADEMIC A 
UNION 
SELECT COUNT(PANUM) as books FROM AUTHOR B 
UNION 
SELECT COUNT(FIELDNUM) as interests FROM INTEREST C 
) results; 

基本上,我需要此查詢(工作)轉換爲上面的查詢,在這裏我使用集合運算符。

SELECT DISTINCT ACNUM 
FROM ACADEMIC A 
WHERE 
    (SELECT COUNT(PANUM) 
    FROM AUTHOR 
    WHERE ACNUM = A.ACNUM) < 5 
AND 
    (SELECT COUNT(FIELDNUM) 
    FROM INTEREST 
    WHERE ACNUM = A.ACNUM) > 3; 
+0

您的要求到目前爲止似乎沒有多大意義。你爲什麼要強制使用set操作? –

+0

這正是我對盧卡斯的感受。這是一個問題,告訴我要使用set操作符:「使用Set操作符創建一個已寫或共同編寫少於5篇論文並且擁有超過3個興趣的學者列表。列出他們的學術編號 輸出「。 –

回答

0

你已經在錯誤的方式使用UNION查詢,因爲在IST查詢內部查詢產生的只有一列,你正在從三列。

您可以使用加入這裏,像這樣:

select a.ACNUM, count(ar.PANUM), count(i.FIELDNUM) 

from ACADEMIC a join AUTHOR ar on a.ACNUM=ar.ACNUM 
    join INTEREST i on a.ACNUM=i.ACNUM 

group by a.ACNUM 
having count(ar.PANUM)<5 and count(i.FIELDNUM)>3; 
+0

似乎沒有返回任何結果,這可能是因爲我實際上沒有一個「count」在5以下的事實,我在該表中有0個匹配的鍵。 –

+0

但是對於你如果第二個查詢正在工作,那麼這也應該如你所使用的ACNUM字段來匹配記錄一樣工作。 –

1

我不知道爲什麼你堅持使用集合運算,但INTERSECT將返回預期的結果:

SELECT ACNUM 
FROM ACADEMIC A 

INTERSECT 

SELECT ACNUM 
FROM AUTHOR 
GROUP BY ACNUM 
HAVING COUNT(PANUM) < 5 

INTERSECT 

SELECT ACNUM 
FROM INTEREST 
GROUP BY ACNUM 
HAVING COUNT(FIELDNUM) > 3; 
+0

這不起作用。兩個相交都沒有返回。我的作者表使用2個鍵設置:ACNUM和PANUM,而我的興趣表使用ACNUM,FIELDNUM和DESCRIP設置 –

+0

此查詢是對原始查詢的精確翻譯。如果它沒有返回預期的結果您的查詢和/或您的描述是錯誤的.... – dnoeth

0
SELECT X.ACNUM, Y.books, Z.interests 
FROM (
(SELECT ACNUM FROM ACADEMIC A)X 
LEFT JOIN 
(SELECT COUNT(PANUM) as books FROM AUTHOR B)Y 
ON X.ACNUM=Y.ACNUM 
LEFT JOIN 
(SELECT COUNT(FIELDNUM) as interests FROM INTEREST C)Z 
ON X.ACNUM=Z.ACNUM) WHERE Y.books<5 and Z.interests>3;