温馨提示:本文翻译自stackoverflow.com,查看原文请点击:sql - Oracle. get max value from the select ad then compare it
join left-join oracle select sql

sql - 甲骨文

发布于 2020-04-04 00:26:59

所以我在选择和构思如何使其工作方面遇到了麻烦。

       SELECT data1.discount, data7.osp_id, data6.id AS sero_id, data1.estpt_id, data5.festpae_id, MAX(data5.festpae_id) as max_id FROM database1 data1
    JOIN database2 data2 ON data2.id = data1.attr_id
    JOIN database3 data3 ON data3.attr_id = data2.id
    JOIN database4 data4 ON data4.objt_attr_id = data3.id
    JOIN database5 data5 ON data5.stya_id = data4.id
        AND data5.value = 1
    JOIN database6 data6 ON data6.id = data5.sero_id
    JOIN database7 data7 ON data7.id = data6.data7_id
    JOIN database8 data8 ON data8.code = 'CALC1'
WHERE data1.interest_rate = 1 AND data1.ordet_id = data8.id
    AND data1.objt_attr_id = data4.objt_attr_id 

这是我选择的女巫无法正常工作。我收到类似的错误

ORA-00937: not a single-group group function

据我了解,这是由于MAX()参数。

没有的输出MAX()是这个:

discount osp_id sero_id estpt_id festpae_id
40       619356 3931831 2144     2000742
50       619356 3931831 2144     2000743
40       619356 3931831 2144     2000737
50       619356 3931831 2144     2000740

因此,正如您所了解的,我需要获取=>的MAXfestpae_id2000743

最后的想法是获取的MAXfestpae_id并将其与进行比较data5.festpae_id,这是获得1条实际记录(而不是全部记录)所需的。

因此,最终输出应为:

discount osp_id sero_id estpt_id festpae_id
50       619356 3931831 2144     2000743

此脚本在View表中用作LEFT OUTER JOIN,因此,如果我order通过它festpae_id然后设置rownum = 1它在View表中无法正常工作(但如果与整个View表select分开运行(作为左外部联接),则可以正常工作),这就是为什么我问你的帮助MAX()还是有更好的办法?

查看更多

提问者
Viktor
被浏览
83
Littlefoot 2020-01-31 21:38

一般而言,未聚合的列应成为该GROUP BY子句的一部分您加入了很多表,但我不知道该去哪里,但是-请看是否有帮助(请注意我写的注释):

  SELECT MAX (data1.discount),                        --> apply aggregate here
         data7.osp_id,
         data6.id AS sero_id,
         data1.estpt_id,
         -- data5.festpae_id,                         --> remove this
         MAX (data5.festpae_id) AS max_id
    FROM database1 data1
         JOIN database2 data2 ON data2.id = data1.attr_id
         JOIN database3 data3 ON data3.attr_id = data2.id
         JOIN database4 data4 ON data4.objt_attr_id = data3.id
         JOIN database5 data5
            ON     data5.stya_id = data4.id
               AND data5.VALUE = 1
         JOIN database6 data6 ON data6.id = data5.sero_id
         JOIN database7 data7 ON data7.id = data6.data7_id
         JOIN database8 data8 ON data8.code = 'CALC1'
   WHERE     data1.interest_rate = 1
         AND data1.ordet_id = data8.id
         AND data1.objt_attr_id = data4.objt_attr_id
GROUP BY data7.osp_id, data6.id, data1.estpt_id       --> add all non-aggregated columns here

[编辑]

使用您发布的示例数据并建议将其应用于查询,结果似乎还可以:

SQL> with test (discount, osp_id, sero_id, estpt_id, festpae_id) as
  2  (
  3  select 40,       619356, 3931831, 2144,     2000742 from dual union all
  4  select 50,       619356, 3931831, 2144,     2000743 from dual union all
  5  select 40,       619356, 3931831, 2144,     2000737 from dual union all
  6  select 50,       619356, 3931831, 2144,     2000740 from dual
  7  )
  8  select max(discount) discount,
  9         osp_id,
 10         sero_id,
 11         estpt_id,
 12         max(festpae_id) festpae_id
 13  from test
 14  group by osp_id,
 15           sero_id,
 16           estpt_id;

  DISCOUNT     OSP_ID    SERO_ID   ESTPT_ID FESTPAE_ID
---------- ---------- ---------- ---------- ----------
        50     619356    3931831       2144    2000743

SQL>

如您所见,仅返回一行FESTPAE_ID = 2000743(根据需要返回最后一行)。如果您得到不同的结果,则必须涉及其他方面。我不知道那是什么-显然,查询工作正常(从我的角度来看)。