Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 嵌套查询-寻找更好的解决方案_Sql_Oracle - Fatal编程技术网

Sql 嵌套查询-寻找更好的解决方案

Sql 嵌套查询-寻找更好的解决方案,sql,oracle,Sql,Oracle,考虑一个销售应用程序,其中有两个表sales和INTERNAL\u sales 表SALES引用了公司外每个销售人员进行的交易数量。 表INTERNAL_SALES引用了公司内部每个销售人员与另一个销售人员进行交易的数量。 销售表: 即使交易记录为零,每个日期对每个销售人员都有一个条目 id | day | sales_person | number_of_transactions 1 | 2011-08-01 | Tom | 1000 2 | 2

考虑一个销售应用程序,其中有两个表sales和INTERNAL\u sales

表SALES引用了公司外每个销售人员进行的交易数量。 表INTERNAL_SALES引用了公司内部每个销售人员与另一个销售人员进行交易的数量。 销售表: 即使交易记录为零,每个日期对每个销售人员都有一个条目

id | day | sales_person | number_of_transactions 1 | 2011-08-01 | Tom | 1000 2 | 2011-08-01 | Ben | 500 3 | 2011-08-01 | Anne | 1500 4 | 2011-08-02 | Tom | 0 5 | 2011-08-02 | Ben | 800 6 | 2011-08-02 | Anne | 900 7 | 2011-08-03 | Tom | 3000 8 | 2011-08-03 | Ben | 0 9 | 2011-08-03 | Anne | 40 内部销售表: 此表仅记录销售人员之间实际进行的交易

id | day | sales_person_from | sales_person_to | number_of_transactions 0 | 2011-08-01 | Tom | Ben | 10 1 | 2011-08-01 | Tom | Anne | 20 2 | 2011-08-01 | Ben | Tom | 50 3 | 2011-08-03 | Anne | Tom | 30 4 | 2011-08-03 | Anne | Tom | 30 现在的问题是如何计算每个销售人员每天的总交易量。我这样做的方式是:

SELECT day, sales_person, sum(num_transactions) from ( SELECT day, sales_person, number_of_transactions As num_transactions FROM sales; UNION SELECT day, sales_person_from As sales_person, sum(number_of_transactions) As num_transactions FROM internal_sales GROUP BY day, sales_person_from; ) GROUP BY day, sales_person;
这太慢了,看起来很难看。我正在寻求更好的解决办法。顺便说一句,Oracle中使用的数据库和我对数据库没有控制权,只是我可以对其运行查询。

无需聚合两次,并且union运算符通常执行隐式唯一排序,这在您的情况下也是不必要的

SELECT day, sales_person, sum(num_transactions) from
(
    SELECT day, sales_person, number_of_transactions As num_transactions FROM sales;
    UNION ALL 
    SELECT day, sales_person_from, number_of_transactions FROM internal_sales;
)
GROUP BY day, sales_person;

删除中间聚合和唯一排序应该会有所帮助

这太慢了?我觉得它一点也不难看。我看不到更直接的解决方案。如果没有修改DB的功能,这里就没有什么可以优化的。+1不需要别名SALES\u PERSON\u FROM,因为数据库从第一个SELECT语句中获取列名并忽略后续列名。此外,工会可能返回错误的结果。例如,如果销售代表TOM在同一天进行了10次外部销售和10次内部销售,则其合计数字为20;联合排序会将这两行视为重复行,因此合计的数字只有10。谢谢您的帮助。您的解决方案附带的解释增加了我对sql的理解。