我需要使用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。
任何帮助将不胜感激!
答案 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;
...但也许你所展示的内容更多,比如按类型或日期进行限制。