转换SQL查询以使用集合运算符

时间:2016-02-12 11:05:49

标签: sql oracle

我需要使用Set Operator完成SQL查询(Oracle),但我很难理解它是如何实现的。

架构:

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;

但是,我正在努力研究如何使用Set运算符来实现同样的目的。我相信我应该使用INTERSECT。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分: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;

你真的不需要加入TRANSACTION,你可以直接计算PERFORMS中的代码值:

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

...但也许你所展示的内容更多,比如按类型或日期进行限制。