Oracle 无子查询重写平均值
如何在没有子查询的情况下重写此查询Oracle 无子查询重写平均值,oracle,subquery,average,Oracle,Subquery,Average,如何在没有子查询的情况下重写此查询 select i.invoice_number, i.invoice_total from invoices i where i.invoice_total>(select avg(payment_total) from invoices); 这里有几种方法。我不能保证你的教授会接受 对于我们的第一个备选方案,您首先创建一个函数: CREATE OR REPLACE FUNCTION AV
select i.invoice_number, i.invoice_total
from invoices i
where i.invoice_total>(select avg(payment_total)
from invoices);
这里有几种方法。我不能保证你的教授会接受 对于我们的第一个备选方案,您首先创建一个函数:
CREATE OR REPLACE FUNCTION AVG_PAYMENT_TOTAL_FUNC RETURN NUMBER IS
nAvg_payment_total NUMBER;
BEGIN
SELECT AVG(PAYMENT_TOTAL)
INTO nAvg_payment_total
FROM INVOICES;
RETURN nAvg_payment_total;
END AVG_PAYMENT_TOTAL_FUNC;
然后在查询中使用该函数:
select i.invoice_number, i.invoice_total
from invoices i
where i.invoice_total > AVG_PAYMENT_TOTAL_FUNC;
第二种选择是创建一个视图:
CREATE OR REPLACE VIEW AVG_PAYMENT_TOTAL_VIEW AS
SELECT AVG(PAYMENT_TOTAL) AS AVG_PAYMENT_TOTAL
FROM INVOICES;
然后您的查询就变成
SELECT i.INVOICE_NUMBER,
i.INVOICE_TOTAL,
t.AVG_PAYMENT_TOTAL
FROM INVOICES i
CROSS JOIN AVG_PAYMENT_TOTAL_VIEW t;
缺少这样的东西,我看不出有什么办法来完成分配给你的任务。更重要的是,我无法想象为什么有人会关心查询中是否有一个或两个SELECT关键字。要求开发人员想出一些古怪的/极客的/书呆子式的方法,只需一个SELECT关键字就可以在一个查询中完成上述所有工作,这是浪费时间。有完全合理的方法可以快速、明智地完成这项工作;要求某人以其他方式解决问题既没有成效也没有效率,因此毫无意义
分享和享受。这里有几种方法。我不能保证你的教授会接受
with average as (select avg(payment_total) avgtot
from invoices)
select i.invoice_number, i.invoice_total
from invoices i
, average a
where i.invoice_total>a.avgtot;
对于我们的第一个备选方案,您首先创建一个函数:
CREATE OR REPLACE FUNCTION AVG_PAYMENT_TOTAL_FUNC RETURN NUMBER IS
nAvg_payment_total NUMBER;
BEGIN
SELECT AVG(PAYMENT_TOTAL)
INTO nAvg_payment_total
FROM INVOICES;
RETURN nAvg_payment_total;
END AVG_PAYMENT_TOTAL_FUNC;
然后在查询中使用该函数:
select i.invoice_number, i.invoice_total
from invoices i
where i.invoice_total > AVG_PAYMENT_TOTAL_FUNC;
第二种选择是创建一个视图:
CREATE OR REPLACE VIEW AVG_PAYMENT_TOTAL_VIEW AS
SELECT AVG(PAYMENT_TOTAL) AS AVG_PAYMENT_TOTAL
FROM INVOICES;
然后您的查询就变成
SELECT i.INVOICE_NUMBER,
i.INVOICE_TOTAL,
t.AVG_PAYMENT_TOTAL
FROM INVOICES i
CROSS JOIN AVG_PAYMENT_TOTAL_VIEW t;
缺少这样的东西,我看不出有什么办法来完成分配给你的任务。更重要的是,我无法想象为什么有人会关心查询中是否有一个或两个SELECT关键字。要求开发人员想出一些古怪的/极客的/书呆子式的方法,只需一个SELECT关键字就可以在一个查询中完成上述所有工作,这是浪费时间。有完全合理的方法可以快速、明智地完成这项工作;要求某人以其他方式解决问题既没有成效也没有效率,因此毫无意义
分享和享受。只有一个选项:-)
with average as (select avg(payment_total) avgtot
from invoices)
select i.invoice_number, i.invoice_total
from invoices i
, average a
where i.invoice_total>a.avgtot;
只有一个选择:-)
您的一个变体..仅在10g+上使用一个select,而不使用笛卡尔自联接:) “返回更新的行”。。我们只返回我们接触过的行。当发票总额>平均金额(付款总额)超过()时,我们用
案例标记每一行是否超过平均值,然后1其他2结束a
。也就是说,这些行的a
设置为1
。然后我们用1
通过invoice\u number[any,1]=invoice\u number[cv(rn),1]
来勾选行(即不更改任何数据..只需将其更新为自身)
与原始查询相比:
SQL> select i.invoice_number, i.invoice_total , i.payment_total
2 from invoices i
3 where i.invoice_total>(select avg(payment_total)
4 from invoices)
5 order by 1;
INVOICE_NUMBER INVOICE_TOTAL PAYMENT_TOTAL
-------------- ------------- -------------
6 6 1
7 7 8
8 8 4
9 9 7
10 10 6
您的一个变体..仅在10g+上使用一个select,而不使用笛卡尔自联接:) “返回更新的行”。。我们只返回我们接触过的行。当发票总额>平均金额(付款总额)超过()时,我们用
案例标记每一行是否超过平均值,然后1其他2结束a
。也就是说,这些行的a
设置为1
。然后我们用1
通过invoice\u number[any,1]=invoice\u number[cv(rn),1]
来勾选行(即不更改任何数据..只需将其更新为自身)
与原始查询相比:
SQL> select i.invoice_number, i.invoice_total , i.payment_total
2 from invoices i
3 where i.invoice_total>(select avg(payment_total)
4 from invoices)
5 order by 1;
INVOICE_NUMBER INVOICE_TOTAL PAYMENT_TOTAL
-------------- ------------- -------------
6 6 1
7 7 8
8 8 4
9 9 7
10 10 6
但您仍然使用子查询来解决此问题(这是一个内嵌视图。是否可以在没有任何视图的情况下解决此任务?只需连接?使用通用表表达式如何?这是否算作子查询?我不确定,它需要使用“选择”一次!但您仍然使用子查询来解决此问题(这是一个内嵌视图。是否可以在没有任何视图的情况下解决此任务?只需连接?使用通用表表达式如何?这算是子查询吗?我不确定,它需要使用“Select”一次!with子句仍然是子查询with子句仍然是子查询谢谢!!这是我一直在寻找的!谢谢!!这是我一直在寻找的!