оракул выбрать где не существует во втором выборе - PullRequest
0 голосов
/ 10 мая 2018

У меня есть эти идентификаторы, и я всегда получаю их в следующем формате:

538693, 538693, 541616, 541616, 541616, 541620, 541116, 541116 , 538639, 538639, 538720, 538720, 538720, 541608, 541608, 541608, 538675, 538675, 538675, 538675

тогда я делаю запрос, который возвращает мне несколько из них, например возвращает мне последние 3 идентификатора. Теперь мне нужно выбрать оставшийся идентификатор из первого набора записей без последних 3.

Это просто пример, у меня более 200 строк этого идентификатора.

Ответы [ 4 ]

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

Проще использовать xmltable для чисел

SELECT *
FROM (
    SELECT to_number(column_value) AS n
    FROM XMLTABLE('538693 , 538693 , 541616 , 541616 , 541616 , 541620 , 541116 ,
                   541116 , 538639 , 538639 , 538720 , 538720 , 538720 , 541608 , 
                   541608 , 541608 , 538675 , 538675 , 538675 , 538675')
    ) o
WHERE n NOT IN (
     select to_number(column_value) 
  FROM xmltable(
        '538675
        ,538675
        ,538675')
        );

Демо

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

У меня нет оракула, чтобы попробовать, но, вероятно, это будет работать.

Например.Если у вас есть идентификаторы 1,2,3 ... 10, запрос ниже вернет 1,2,3, .. 7

SELECT ID FROM TableName WHERE ID NOT IN
(SELECT ID FROM TableName WHERE ROWNUM < 3)

Не уверен насчет синтаксиса, просто попробуйте логику:)

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

Вот еще одно возможное решение без преобразования вывода в строку. Посмотрите, приемлемо ли это в вашем случае. Это преобразует ваши строки в столбцы. Тогда легко удалить последние 3 строки:

select distinct column_value from table(sys.odcinumberlist(1,1,2,3,3,4,4,5));
0 голосов
/ 10 мая 2018

Вот пример, который может дать вам идею.Посмотрите.

SQL> with
  2  -- a long list of (duplicate?) IDs
  3  all_ids (col) as
  4    (select '538693 , 538693 , 541616 , 541616 , 541616 , 541620 , 541116 , 541116 , 538639 , 538639' from dual
  5    ),
  6  -- that's what you get from your query
  7  do_query (col) as
  8    (select '541116 , 538639 , 538639' from dual
  9    ),
 10  -- split ALL_IDs to rows
 11  all_1 as
 12    (select regexp_substr(col, '[^ , ]+', 1, level) col
 13     from all_ids
 14     connect by level <= regexp_count(col, ',') + 1
 15    ),
 16  -- split IDs from DO_QUERY to rows as well
 17  do_1 as
 18    (select regexp_substr(col, '[^ , ]+', 1, level) col
 19     from do_query
 20     connect by level <= regexp_count(col, ',') + 1
 21    ),
 22  -- MINUS set operator will return IDs from ALL_IDS that aren't in DO_QUERY IDs
 23  minus_me as
 24    (select col From all_1
 25     minus
 26     select col from do_1
 27    )
 28  -- finally, compose the remaining **unique** IDs back
 29  select listagg(col, ' , ') within group (order by col) result
 30  from minus_me;

RESULT
--------------------------------------------------------------------------------
538693 , 541616 , 541620

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