Sql 如何在具有“单组函数”的SELECT子句中使用两个字段

Sql 如何在具有“单组函数”的SELECT子句中使用两个字段,sql,database,oracle,join,Sql,Database,Oracle,Join,我需要编写一个连接许多查询的查询。它们由一个ID连接。问题是,在其中一个查询中,我必须选择的值是一个单组函数,我必须在on子句上计算一个条件,该条件必须使用第二个选定列,我无法添加该列。我将编写比代码简单得多的示例: Select frst.FirstResult, scnd.FirstResult from( Select something AS FirstResult, ID_to_compare as SecondResult from table Where -- [

我需要编写一个连接许多查询的查询。它们由一个ID连接。问题是,在其中一个查询中,我必须选择的值是一个单组函数,我必须在on子句上计算一个条件,该条件必须使用第二个选定列,我无法添加该列。我将编写比代码简单得多的示例:

Select frst.FirstResult, scnd.FirstResult 
from(
    Select something AS FirstResult, ID_to_compare as SecondResult from table
    Where -- [...]
) frst

join(
    Select something AS FirstResult, ID_to_compare as SecondResult from table2
    Where -- [...] 
) scnd 
ON frst.SecondResult=scnd.SecondResult

join(
    Select something AS FirstResult, ID_to_compare as SecondResult from table3
    Where -- [...]
) trd 
ON scnd.SecondResult=trd.SecondResult

-- [...]

join(
    Select single_group_function(params) AS FirstResult, ID_to_compare as SecondResult from table3
--This select cannot be done because of the group function cannot be executed
    Where -- [...]
) trd 
ON svn.SecondResult=eit.SecondResult
我的问题是,我需要比较每个select的SecondResult,但不允许成员组进行这样的查询。我试过使用双表,但它对我来说真的很乱,我不知道如何使用它。我还尝试将它们加入到宏查询中,但每个选择都足够大,以至于编写起来非常混乱。我从中吸取了很多想法。你有什么要我完成任务的暗示吗

对于MT0申请,一个最小的完整且可验证的问题是:

Select frst.FirstField, scnd.FirstField, frst.SecondField
from
(Select a1.DUMMY as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1) frst
  join
(Select a1.DUMMY as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1) scnd
  ON frst.SecondField = scnd.SecondField

  join
  (Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1) trd
  ON trd.SecondField = scnd.SecondField
  ;
我希望在这种情况下

frst.FirstField  scnd.FirstField  frst.SecondField
---------------- ---------------- --------------------
X                X                1
但我得到的是

Error en la línea de comandos : 11 Columna : 40
Informe de error -
Error SQL: ORA-00937: la función de grupo no es de grupo único
00937. 00000 -  "not a single-group group function"
*Cause:    
*Action:

这是您的示例子查询:

Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
from dual a1 join dual a2 on 1=1
那么,您是否希望有一个结果行?这就是没有GROUP BY的聚合所做的。你可以得到所有记录的总和,但是在这个结果记录中要显示哪个a2.DUMMY?这就是DBMS所抱怨的

您可能想要的是每个a2.0的总和。因此,请按此列分组:

Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
from dual a1 join dual a2 on 1=1
GROUP BY a2.DUMMY

这是您的示例子查询:

Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
from dual a1 join dual a2 on 1=1
那么,您是否希望有一个结果行?这就是没有GROUP BY的聚合所做的。你可以得到所有记录的总和,但是在这个结果记录中要显示哪个a2.DUMMY?这就是DBMS所抱怨的

您可能想要的是每个a2.0的总和。因此,请按此列分组:

Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
from dual a1 join dual a2 on 1=1
GROUP BY a2.DUMMY

在您的简化示例中,您正在执行:

  join
  (Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1) trd
  ON trd.SecondField = scnd.SecondField
您可以进一步简化以查看问题:

Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
from dual a1 join dual a2 on 1=1;

ORA-00937: not a single-group group function
必须在group by子句中包含任何未聚合的列:

Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
from dual a1 join dual a2 on 1=1
group by a2.DUMMY;
现在将得到ORA-01722,因为dummy是一个字符串;改用max:

Select frst.FirstField, scnd.FirstField, frst.SecondField
from
(Select a1.DUMMY as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1) frst
  join
(Select a1.DUMMY as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1) scnd
  ON frst.SecondField = scnd.SecondField

  join
  (Select max(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1 group by a2.DUMMY) trd
  ON trd.SecondField = scnd.SecondField
  ;

F F S
- - -
X X X
因此,您需要执行以下操作:

    Select single_group_function(params) AS FirstResult, ID_to_compare as SecondResult from table3
    Where -- [...]
    group by ID_to_compare

在其子查询中

在简化的示例中,您正在执行:

  join
  (Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1) trd
  ON trd.SecondField = scnd.SecondField
您可以进一步简化以查看问题:

Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
from dual a1 join dual a2 on 1=1;

ORA-00937: not a single-group group function
必须在group by子句中包含任何未聚合的列:

Select sum(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
from dual a1 join dual a2 on 1=1
group by a2.DUMMY;
现在将得到ORA-01722,因为dummy是一个字符串;改用max:

Select frst.FirstField, scnd.FirstField, frst.SecondField
from
(Select a1.DUMMY as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1) frst
  join
(Select a1.DUMMY as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1) scnd
  ON frst.SecondField = scnd.SecondField

  join
  (Select max(a1.DUMMY) as FirstField, a2.DUMMY as SecondField
    from dual a1 join dual a2 on 1=1 group by a2.DUMMY) trd
  ON trd.SecondField = scnd.SecondField
  ;

F F S
- - -
X X X
因此,您需要执行以下操作:

    Select single_group_function(params) AS FirstResult, ID_to_compare as SecondResult from table3
    Where -- [...]
    group by ID_to_compare

在其子查询

中,您能否为一些示例数据提供一个DDL/DML语句,以及您的预期输出,以说明问题的最低版本。感谢您的反馈@MT0您可以使用DDL/DML语句为一些示例数据和预期输出提供一个示例,以说明问题的最低版本。感谢您的反馈@MT0