2016-02-12 41 views
0

我需要使用Set運算符來完成SQL查詢(Oracle),但我很難理解它將如何實現。轉換SQL查詢以使用設置運算符

模式:

Customer (ID, firstName, lastName)  - PrimaryKey: ID 
Transaction (code, type, date, amount) - PrimaryKey: code 
performs(code*, ID*)      - PrimaryKey: code - ForeignKey: ID 

查詢需要顯示Customer.ID的人都擁有完整的一個或更少的交易。我可以通過以下完成此:

SELECT C.ID 
FROM CUSTOMER C 
INNER JOIN PERFORMS P 
ON C.ID = P.ID 
INNER JOIN TRANSACTION T 
ON T.CODE = P.CODE 
GROUP BY C.ID 
HAVING COUNT(T.CODE) <= 1; 

但是,我奮力工作,如何使用集合運算符來實現同樣的事情。我相信我應該使用INTERSECT。

任何幫助,將不勝感激!

+1

我的賭注是在課程上的工作。而你錯過了數據庫標籤 –

+0

爲什麼?這裏沒有理由使用set操作符。 JOIN/IN/EXISTS是這裏的默認選項 –

+0

@haytem因爲老師想要教他們做什麼課程? –

回答

0

這不是你通常會這樣做的方式,但作爲練習,您可以獲取所有客戶ID的集合,並且可以將所有ID的集合與兩個以上的事務關聯,而無需查看客戶表中的第二次:

SELECT C.ID 
FROM CUSTOMER C 
MINUS 
SELECT P.ID 
FROM PERFORMS P 
INNER JOIN TRANSACTION T 
ON T.CODE = P.CODE 
GROUP BY P.ID 
HAVING COUNT(T.CODE) > 1; 

你並不真的需要加入到交易中,你可以直接執行僅計算代碼值:

SELECT C.ID 
FROM CUSTOMER C 
MINUS 
SELECT P.ID 
FROM PERFORMS P 
GROUP BY P.ID 
HAVING COUNT(P.CODE) > 1; 

...但也許有更多的問題顯示的內容,例如按照類型或日期進行限制。

+0

謝謝你的幫助!現在我可以看到它在行動中變得非常有意義! – Smeckop