Oracle SQL: вернуть набор без дубликатов - PullRequest
2 голосов
/ 11 ноября 2019

Использование следующего запроса работает для меня, за исключением того, что мне нужно возвращать только один результат для каждого TPHONE.ID.

Что я пытаюсь сделать, это проверить две таблицы на три поля даты (двав таблице TPHONE и одну в таблице TPHONEREQUEST и вернуть TPHONE.ID любого места, где я нахожу даты в определенном диапазоне. Однако, если более одной записи в любой таблице имеет одну или несколько дат в пределахдиапазон дат, который я все еще хочу вернуть TPHONE.ID один раз.

SELECT 
   TPHONE.ID,
   TPHONE.LOCATIONID,
   TPHONE.DLASTCHANGED,
   TPHONE.D02,
   TPHONEREQUEST.D03
FROM
   TPHONE, TPHONEREQUEST
WHERE
   TPHONE.ID = TPHONEREQUEST.DEVICEID
   AND TPHONE.ID IN
   (
   SELECT
      TPHONE.ID
   FROM
      TPHONE
   WHERE
      TPHONE.DLASTCHANGED >= '7/1/2019' AND TPHONE.DLASTCHANGED < '10/1/2019'
      OR TPHONE.D02 >= '7/1/2019' AND TPHONE.D02 < '10/1/2019'
      OR TPHONEREQUEST.D03 >= '7/1/2019' AND TPHONEREQUEST.D03 < '10/1/2019'
   )
ORDER BY
   TPHONE.LOCATIONID, TPHONE.ID

1 Ответ

1 голос
/ 11 ноября 2019

Вы можете использовать ROW_NUMBER для перечисления строк с одинаковым идентификатором, а затем выбрать только первый экземпляр:

SELECT TPHONE.ID,
       TPHONE.LOCATIONID,
       TPHONE.DLASTCHANGED,
       TPHONE.D02,
       TPHONEREQUEST.D03
FROM (
         SELECT TPHONE.ID,
                TPHONE.LOCATIONID,
                TPHONE.DLASTCHANGED,
                TPHONE.D02,
                TPHONEREQUEST.D03,
                ROW_NUMBER() over (PARTITION BY TPHONE.ID ORDER BY TPHONE.ID) as RN
         FROM TPHONE,
              TPHONEREQUEST
         WHERE TPHONE.ID = TPHONEREQUEST.DEVICEID
           AND TPHONE.ID IN
               (
                   SELECT TPHONE.ID
                   FROM TPHONE
                   WHERE TPHONE.DLASTCHANGED >= '7/1/2019' AND TPHONE.DLASTCHANGED < '10/1/2019'
                      OR TPHONE.D02 >= '7/1/2019' AND TPHONE.D02 < '10/1/2019'
                      OR TPHONEREQUEST.D03 >= '7/1/2019' AND TPHONEREQUEST.D03 < '10/1/2019'
               )
         ORDER BY TPHONE.LOCATIONID, TPHONE.ID
     )
WHERE RN = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...