首页 > 解决方案 > 甲骨文。从选择的广告中获取最大值然后进行比较

问题描述

所以我在选择和想法如何使它工作时遇到了一些麻烦。

       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

所以你可以理解我需要获得=>MAX的价值festpae_id2000743

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

所以最终的输出应该是这样的:

discount osp_id sero_id estpt_id festpae_id
50       619356 3931831 2144     2000743

该脚本在视图表中使用LEFT OUTER JOIN,所以如果我order通过festpae_id然后设置rownum = 1它在视图表中无法正常工作(但如果与整个视图表选择(作为左外连接)分开运行,则它可以工作),这就是为什么我'我请求你的帮助如何做到这一点MAX()。或者有什么更好的方法吗?

标签: sqloraclejoinselectleft-join

解决方案


一般来说,未聚合的列应该是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(最后一行,如您所愿)。如果你得到了不同的结果,那肯定还有别的东西。那会是什么,我不知道 - 显然,查询工作正常(从我的角度来看)。


推荐阅读