Запрос работает в mySql и не работает в Oracle - PullRequest
0 голосов
/ 24 августа 2018

Ниже приведен запрос, который работает в MySQL и не работает в Oracle.Здесь мне нужно получить самую последнюю дату и соответствующее событие из таблицы r для каждого идентификатора в таблице а.Идентификатор уникален.


 SELECT a.name , a.spids , a.group , a.id , r.date,r.event  FROM a
    LEFT OUTER JOIN ( SELECT id, MAX(date) AS latest FROM r  GROUP BY id ) AS rev
        ON rev.id = a.id
    LEFT OUTER JOIN r  ON r.id = rev.id
       AND r.date = rev.latest
     group by a.id order by ID;
    --------------------------------------------- 
    *The error in Oracle is "Not a group by function"
    I read several blogs about group by function and every where they are saying to use an aggregate funciton like sum , min,max. I tried but not able to get the results*
    -----------------------
    Table a ( It has other column - group also)
    -----------------------


   ID  Name   Spids  
    1   SIML    TRDR,THYU
    2   SIML    YUIL
    3   ghhe    yhgu,hjuy,kiuj
    4   th      yuio


   ----------------------- 
    Table r  ( Needs to get the latest updated date and corresponding event details for every ID)
    ----------------------- 


   ID     Event         Date
    1      by chris      02-02-2016
    1      by Steve      02-02-2013
    1      by gen        02-02-2014
    2      by Pete       12-12-2018
    2      by ken        01-02-2014
    3      by Mike       20-08-2018
    3      by chin       20-08-2017
    4      by chn        04-06-2012
    4      by tink       06-06-2017

Вывод должен быть таким ---------------------------

NAMe     SPIDS           GROUP      ID      DATE                  EVENT
    SIML    TRDR,THYU        Test        1    02-02-2016             by chris
    SIML    YUIL             Test        2    12-12-2018             by Pete 
    ghhe    yhgu,hjuy,kiuj   Test2       3    20-08-2018             by Mike
    th      yuio             Test1       4    06-06-2017             by tink

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Когда вы делаете group by, вы агрегируете результаты, поэтому выбор должен учитывать только агрегированные столбцы, которые равны a.id, и в этом случае вызывает агрегирующие функции.Поскольку a.id является primary key в этом конкретном примере, другие ваши столбцы a могут быть использованы в предложении select в MySQL, вполне логично, если вы спросите меня.Однако столбец r в таком group by является опасным с точки зрения потенциальной ошибки также в MySQL, если только не существует единственного r, наибольшего для любой записи a.Вы можете решить эту проблему, перечислив все неагрегированные столбцы, используемые в предложении select, в предложение group by.

0 голосов
/ 24 августа 2018

Ваш select:

select a.name , a.spids , a.group , a.id , r.date, r.event

Ваш group by:

 group by a.id

Это несовместимо - каковы значения всех других столбцов в select, кроме a.id. То, что MySQL поддерживает это, является (ошибочной) особенностью базы данных, не поддерживаемой почти любой другой базой данных.

Наиболее типичное решение - это исправить их, чтобы они были совместимы:

select a.name, a.spids, a.group, a.id, max(r.date), max(r.event)

Ваш group by:

 group by a.name , a.spids , a.group , a.id

В вашем случае group by, вероятно, вообще не нужен:

SELECT a.name, a.spids, a.group, a.id, r.date, r.event  
FROM a LEFT OUTER JOIN
     (SELECT id, MAX(date) AS latest
      FROM r
      GROUP BY id
     ) rev
     ON rev.id = a.id LEFT JOIN
     r 
     ON r.id = rev.id  AND r.date = rev.latest
ORDER BY ID;

Вам это нужно, только если есть несколько строк с одинаковой максимальной датой.

Наиболее распространенное решение в Oracle решает эту проблему:

SELECT a.name, a.spids, a.group, a.id, r.date, r.event  
FROM a LEFT JOIN
     (SELECT r.*,
             ROW_NUMBER() OVER (PARTITION BY r.id ORDER BY r.date DESC) as seqnum
      FROM r
     ) rev
     ON rev.id = a.id AND seqnum = 1
ORDER BY ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...