有没有办法避免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