Почему Oracle не выдает сообщение об ошибке из-за отсутствия предложения GROUP BY? - PullRequest
0 голосов
/ 23 мая 2018

Я на Oracle 11g и довольно озадачен тем, как третий запрос может даже скомпилироваться ниже.Разве это не должно вызвать ошибку ORA-00937?Может ли кто-нибудь еще воспроизвести это или объяснить, как или почему Oracle игнорирует отсутствие предложения GROUP BY во встроенном представлении?(он выдает ошибку только при запуске самого подзапроса)

DROP TABLE ZZZ_DELETE_ME;
CREATE TABLE ZZZ_DELETE_ME
(
contract NUMBER(6),
lives INTEGER
 );

 INSERT INTO ZZZ_DELETE_ME (contract,lives) VALUES (123456,100);
 INSERT INTO ZZZ_DELETE_ME (contract,lives) VALUES (123456,50);
 INSERT INTO ZZZ_DELETE_ME (contract,lives) VALUES (123457,100);
 INSERT INTO ZZZ_DELETE_ME (contract,lives) VALUES (123457,50);
 INSERT INTO ZZZ_DELETE_ME (contract,lives) VALUES (123458,100);
 INSERT INTO ZZZ_DELETE_ME (contract,lives) VALUES (123458,50);
 INSERT INTO ZZZ_DELETE_ME (contract,lives) VALUES (123459,100);
 INSERT INTO ZZZ_DELETE_ME (contract,lives) VALUES (123459,50);

 -- query 1 returns 100 for each record (which makes sense)
 SELECT contract, SUM(MAX_LIVES) TOTAL_LIVES
 FROM 
     (
     SELECT contract, MAX(lives) MAX_LIVES
     FROM ZZZ_DELETE_ME 
     GROUP BY contract
     )
 GROUP BY contract;

 -- query 2 returns 400 (which makes sense)
 SELECT SUM(MAX_LIVES) TOTAL_LIVES
 FROM 
     (
     SELECT contract, MAX(lives) MAX_LIVES
     FROM ZZZ_DELETE_ME 
     GROUP BY contract
     );

 -- query 3 returns 100 (but why?  Shouldn't this throw an error?)
 SELECT SUM(MAX_LIVES) TOTAL_LIVES
 FROM 
     (
     SELECT contract, MAX(lives) MAX_LIVES
     FROM ZZZ_DELETE_ME 
     -- THERE'S NO GROUP BY HERE!
     );       

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Это ошибка Oracle 5520732, исправленная в выпуске 11.2.Если у вас есть учетная запись службы поддержки Oracle, вы можете прочитать все об этом.

Для подтверждения вы можете изменить свой запрос на

SELECT SUM(MAX_LIVES) TOTAL_LIVES
FROM 
   (
   SELECT /*+ NO_MERGE */ contract, MAX(lives) MAX_LIVES
   FROM ZZZ_DELETE_ME 
   -- THERE'S NO GROUP BY HERE!
   );   

... и вы получите ожидаемую ошибку.

0 голосов
/ 23 мая 2018

Oracle 12c производит ORA-00937 в этом случае, я проверял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...