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
Oracle 无子查询重写平均值_Oracle_Subquery_Average - Fatal编程技术网

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子句仍然是子查询谢谢!!这是我一直在寻找的!谢谢!!这是我一直在寻找的!