Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите с запросом  [new]
BuryCommoner
Member

Откуда: Абакан
Сообщений: 175
Всем привет!
В базе в таблице лежат данные с ключом-строкой. Как написать запрос, чтоб можно было быстро узнать каких данных не хватает в таблице, имея текстовик со списком ключей?

Например, в DB2 это можно было сделать примерно так:
with q (id) as (values 'id1', 'id2', ...)
select id
from q
where id not in (select id from table1)
 


А как сделать такое в оракле? Без использования хранимых процедур и создания дополнительных таблиц?

---------------------------------------------------------
is null or not is null
30 ноя 18, 17:24    [21750476]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
-2-
Member

Откуда:
Сообщений: 14079
BuryCommoner
текстовик со списком ключей
Если строка до 4000 байт, instr. Если больше, то union. Если файл доступен на сервере, внешняя таблица.
30 ноя 18, 17:36    [21750499]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2075
BuryCommoner,

это?
with q as (select column_value id from table(sys.odcivarchar2list('id1', 'id2', 'id3')))
select * from q where q.id not in (select id from table1)
30 ноя 18, 17:39    [21750505]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Vadim Lejnin
Member

Откуда:
Сообщений: 6422
BuryCommoner
Всем привет!
В базе в таблице лежат данные с ключом-строкой. Как написать запрос, чтоб можно было быстро узнать каких данных не хватает в таблице, имея текстовик со списком ключей?

Например, в DB2 это можно было сделать примерно так:
with q (id) as (values 'id1', 'id2', ...)
select id
from q
where id not in (select id from table1)
 


А как сделать такое в оракле? Без использования хранимых процедур и создания дополнительных таблиц?

---------------------------------------------------------
is null or not is null


1) Если файл со списом ключей доступен через объект ORACLE Directory, и возможна загрузка ключей external table (при вменяемом формате )

2) использование with

with q(id) as (
select 1 from dual union all
select 2 from dual union all
select 45 from dual union all
select 3 from dual
)
select id
from q
where id not in (select id from table1)
;
30 ноя 18, 17:41    [21750515]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
BuryCommoner
Member

Откуда: Абакан
Сообщений: 175
--Eugene--
BuryCommoner,

это?
with q as (select column_value id from table(sys.odcivarchar2list('id1', 'id2', 'id3')))
select * from q where q.id not in (select id from table1)


Да! Это то, что нужно. Спасибо большое, завтра попробую с компа.
30 ноя 18, 18:37    [21750624]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
BuryCommoner
Member

Откуда: Абакан
Сообщений: 175
Vadim Lejnin, спасибо за совет. Вариант с select from dual union находил, но решил поискать что-нибудь покомпактнее (чтоб меньше действий делать при предобработке текста)
30 ноя 18, 18:39    [21750629]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2075
BuryCommoner
Это то, что нужно
попробую немного не согласиться.
зацените:
with q as (select column_value id from table(sys.odcivarchar2list('id1', 'id2', 'id3')))
select * from q where not exists(select 1 from table1 t where t.id = q.id)
30 ноя 18, 18:50    [21750646]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16897
BuryCommoner
завтра попробую с компа.

Попробуйте.
Но тут есть лимит - как найдете, обязательно отпишитесь в теме.
30 ноя 18, 18:51    [21750647]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16897
--Eugene--
зацените:

Что именно предлагается "заценить"?
30 ноя 18, 18:52    [21750649]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2075
andrey_anonymous,

ну (я думаю) у него по TABLE1.ID имеется индекс, который будет задействован во втором случае, а в первом (возможно) нет.
ошибаюсь?
30 ноя 18, 19:00    [21750658]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
-2-
Member

Откуда:
Сообщений: 14079
--Eugene--
ну (я думаю) у него по TABLE1.ID имеется индекс, который будет задействован во втором случае, а в первом (возможно) нет.
ошибаюсь?
Если поле not null, на что намекает именование, то без разницы.
30 ноя 18, 19:02    [21750661]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16897
--Eugene--
ну (я думаю) у него по TABLE1.ID имеется индекс, который будет задействован во втором случае, а в первом (возможно) нет.
ошибаюсь?

Как решит CBO - так и будет. И та, и другая логическая конструкция могут реализовываться оптимизатором и как анти-соединение, и как фильтр.
Другой вопрос, что это не эквивалентные конструкции.
30 ноя 18, 19:06    [21750666]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16897
-2-
Если поле not null

Ну блин, ведь всю интригу поломал... :)
30 ноя 18, 19:07    [21750673]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2075
BuryCommoner,
andrey_anonymous
всю интригу поломал... :)
вот и спрашивай их о чем-то)
30 ноя 18, 19:13    [21750681]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить