哪个Oracle Join可以找出复杂的查询

时间:2014-12-23 20:35:05

标签: sql oracle join

我想要加入两个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

类别值有点像他们可能涵盖的类别(领域?)。

2 个答案:

答案 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子句的用户。总结多个用户将很难。