两个SELECT语句单独使用可以工作,但一起使用时却无法正常运行。

4
我有两个单独工作的选择语句,但不能同时运行。
这个是:
SELECT MAX(a2.Fachanzahl)
FROM C17_AbfrageBView a2;

执行操作并返回一个带有一个列和值为2的行。
这个:
SELECT a1.PersonID, a1.Vorname, a1.Nachname, MAX(a1.Fachanzahl) Fachanzahl
FROM C17_AbfrageBView a1
GROUP BY a1.PersonID, a1.Vorname, a1.Nachname
HAVING MAX(a1.Fachanzahl) = 2;

这是英语文本,大意为:“执行操作并返回正确的行。但这个:”。
SELECT a1.PersonID, a1.Vorname, a1.Nachname, MAX(a1.Fachanzahl) Fachanzahl
FROM C17_AbfrageBView a1
GROUP BY a1.PersonID, a1.Vorname, a1.Nachname
HAVING MAX(a1.Fachanzahl) = (
                              SELECT MAX(a2.Fachanzahl)
                              FROM C17_AbfrageBView a2
                            );

不返回任何内容(它应该返回与上面语句相同的行),即使外部和内部选择语句单独工作。这里的问题是什么?
谢谢!

1
如果更改查询语句为:select * from (SELECT a1.PersonID, a1.Vorname, a1.Nachname, MAX(a1.Fachanzahl) Fachanzahl FROM C17_AbfrageBView a1 GROUP BY a1.PersonID, a1.Vorname, a1.Nachname) t where t.Fachanzahl = ( SELECT MAX(a2.Fachanzahl) FROM C17_AbfrageBView a2 );,则返回什么? - I3rutt
@l3rutt 非常好,谢谢你! - Petra1999
这段代码在同一实例中执行吗?如果将最大值存储到变量中,并在HAVING子句中使用该变量,仍会返回错误的输出吗? - Emka
@Petra1999,然而我们并没有找出你的代码为什么不起作用。 - I3rutt
2
@Petra1999 这个应该可以用:http://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=28817a3f6ec6d65e68d89a32050fac70 Fachanzahl 数据类型是什么? - Radim Bača
这看起来像是一个错误... 你使用的是哪个版本和补丁级别的Oracle? - Alex Poole
1个回答

1

我想不出这种情况发生的机制。据我所知,MAX()不会改变列的类型,排除了浮点舍入误差或排序不兼容等因素。

我可以说,如果使用WHERE而不是HAVING编写查询,则查询将更有效率:

SELECT DISTINCT a1.PersonID, a1.Vorname, a1.Nachname, a1.Fachanzahl
FROM C17_AbfrageBView a1
WHERE a1.Fachanzahl = (SELECT MAX(a2.Fachanzahl)
                       FROM C17_AbfrageBView a2
                      );

如果MAX()在值的微小变化方面引入了一些问题,那么这个方法可能可以解决问题。
因为您只关心最大值(至少在问题中的查询中),所以您可以先进行筛选。这使得查询更加高效。 SELECT DISTINCTGROUP BY之间的区别应该是微不足道的。前者更容易输入。

我唯一的猜测是原始代码因语句的执行顺序而失败。如果在评估HAVING子句时子查询没有值,它将生成OP看到的空结果。 - Christian Palmer
@ChristianPalmer . . . Oracle应该是事务安全的,因此对数据的更改不应影响查询。 - Gordon Linoff
我并不是指数据的更改 - 只是两个语句执行的顺序。数据库应该先评估子查询,这似乎是显而易见的,但也许由于某个错误它没有这样做。 - Christian Palmer
@ChristianPalmer . . . 那应该没有任何区别。最大值就是最大值--我相信这是相当确定的。那个最大值应该在某个组中。类型不应该改变。可以使用 = 找到该组。 - Gordon Linoff
好的 - 我并不是在说应该发生什么 - 当然这个语句(虽然笨拙)应该能够工作。我正在推测可能会导致这个问题的错误类型。 - Christian Palmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接