Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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 plus中的笛卡尔连接_Sql_Sqlplus - Fatal编程技术网

有没有办法避免sql plus中的笛卡尔连接

有没有办法避免sql plus中的笛卡尔连接,sql,sqlplus,Sql,Sqlplus,我有以下三个表格: supplied_items(SUPPLIER_ID,ITEM_ID,QUANTITY,COST_PRICE); ORDERS(ORDER_ID,CUSTOMER_ID,EMPLOYEE_ID,ITEM_ID,PRICE,QUANTITY,TOTAL_PRICE,ODATE); EXPENSES(EXPENSE_ID,EDATE,DESCRIPTION,PAYMENT_TYPE,AMOUNT); 我必须计算净利润。但当我在查询中包含费用表时,它会和其他表的行进行笛卡尔积。

我有以下三个表格:

supplied_items(SUPPLIER_ID,ITEM_ID,QUANTITY,COST_PRICE);
ORDERS(ORDER_ID,CUSTOMER_ID,EMPLOYEE_ID,ITEM_ID,PRICE,QUANTITY,TOTAL_PRICE,ODATE);
EXPENSES(EXPENSE_ID,EDATE,DESCRIPTION,PAYMENT_TYPE,AMOUNT);
我必须计算净利润。但当我在查询中包含费用表时,它会和其他表的行进行笛卡尔积。 以下是我的疑问:

SELECT
    SUM(orders.quantity * orders.price) AS "Sale",
    SUM(orders.quantity * supplied_items.cost_price) AS "COST",
    SUM(orders.quantity *(orders.price - supplied_items.cost_price)) AS "Profit",
    SUM(expenses.amount)
FROM
    orders
    LEFT OUTER JOIN supplied_items ON orders.item_id = supplied_items.item_id
    CROSS JOIN expenses;                                    

似乎您需要费用表的全部结果:

SELECT
    SUM(orders.quantity * orders.price) AS "Sale",
    SUM(orders.quantity * supplied_items.cost_price) AS "COST",
    SUM(orders.quantity *(orders.price - supplied_items.cost_price)) AS "Profit",
    MAX(select SUM(expenses.amount) from expenses) as "Expenses"
FROM
    orders
    LEFT OUTER JOIN supplied_items ON orders.item_id = supplied_items.item_id
ORA-00937:非单个组功能原因:

选择列表 不能同时包含组函数,例如平均值、计数、最大值、最小值、, SUM、STDEV或VARIANCE以及单个列表达式,除非 单个列表达式包含在GROUPBY子句中

这意味着,如果不使用适当的group by子句,就无法在oracle中对列和未进行聚合的列使用聚合函数

出于同样的原因,您不能使用表1中的select a、sumb或表1中的select sumb、select sumafrom ABLE 1

与其他列一样,您需要使用group函数包装子查询。请试试这个:

SELECT
    SUM(orders.quantity * orders.price) AS "Sale",
    SUM(orders.quantity * supplied_items.cost_price) AS "COST",
    SUM(orders.quantity *(orders.price - supplied_items.cost_price)) AS "Profit",
    max(select SUM(expenses.amount) from expenses) expense_amount
FROM
    orders
    LEFT OUTER JOIN supplied_items ON orders.item_id = supplied_items.item_id;   
或者您也可以这样做:

select Sale, COST, Profit,(select SUM(expenses.amount) from expenses) expense_amount
from
(SELECT
    SUM(orders.quantity * orders.price) AS "Sale",
    SUM(orders.quantity * supplied_items.cost_price) AS "COST",
    SUM(orders.quantity *(orders.price - supplied_items.cost_price)) AS "Profit",
    
FROM
    orders
    LEFT OUTER JOIN supplied_items ON orders.item_id = supplied_items.item_id;   
)t

为了避免交叉联接,您需要在费用表中与其他表共用一个列,或者您可以在保持交叉联接的同时按某些列分组。是的,您是对的,但在查询中选择SUMexpenses.amount here SUM不是一个单独的分组函数,它会创建一个错误。不确定这是什么意思,该子查询返回一个结果并肯定有效,给它一个tryIt在第5行给出错误:ORA-00937:不是单个组function@MuhammadAfnanAkram你用MAX把它包起来怎么样?请参阅更新的asnwer