我想要加入两个Oracle表,但想不到要使用的正确连接。
Sales_Summary
Product Sales Category1 Category2 Category3 Category4
123 $100 1 0 2 0
123 $200 2 0 2 0
456 $500 1 0 4 0
456 $400 5 2 4 8
User_Access
User Category CategoryNum
213 1 1
213 2 3
我尝试了左连接:
select sum(sales) from sales_summary ss
left join user_access ua
on (ss.category1 = ua.category where categorynum = 1)
or (ss.category2 = ua.category where categorynum = 2)
or (ss.category3 = ua.category where categorynum = 3)
or (ss.category4 = ua.category where categorynum = 4)
但是当用户有权访问多个类别时,它似乎会重复结果。
使用上面的SQL,我希望对于用户213,它显示所有产品的总销售额为800美元。
Category1 / Category2 / Category4 / Category4 =不同的销售类别,等于CategoryNum
类别值有点像他们可能涵盖的类别(领域?)。
答案 0 :(得分:2)
你几乎做对了。只需将where
替换为and
- 您需要一个group by
子句才能使用聚合函数SUM
(假设您可能有几个用户):
SELECT "User", SUM("Sales")
FROM sales_summary ss
JOIN user_access ua
ON (ss."Category1" = ua."Category" AND "CategoryNum" = 1)
OR (ss."Category2" = ua."Category" AND "CategoryNum" = 2)
OR (ss."Category3" = ua."Category" AND "CategoryNum" = 3)
OR (ss."Category4" = ua."Category" AND "CategoryNum" = 4)
GROUP BY "User"
请参阅http://sqlfiddle.com/#!4/73d3e/5
...但是,这会产生 $ 900 的总和。也许你应该检查你的要求和背后的逻辑,如果预期结果真的是800美元......
请注意,我在此处引用了所有标识符,例如您的示例数据,您使用了似乎区分大小写的列名和一列名为User
,因此要求被引用,因为这是一个保留关键字。您的里程可能会有所不同。
答案 1 :(得分:2)
使用join
获得800美元的价值将会非常困难。您可以使用exists
获取价值:
SELECT SUM("Sales")
FROM sales_summary ss
WHERE EXISTS (SELECT 1
FROM user_access ua
WHERE (ss."Category1" = ua."Category" AND "CategoryNum" = 1) OR
(ss."Category2" = ua."Category" AND "CategoryNum" = 2) OR
(ss."Category3" = ua."Category" AND "CategoryNum" = 3) OR
(ss."Category4" = ua."Category" AND "CategoryNum" = 4)
)
这种方法的问题在于您无法指定用户。您可以在子查询中指定一个具有where
子句的用户。总结多个用户将很难。