Написание SQL-запроса для заданного набора значений - PullRequest
1 голос
/ 22 сентября 2011

Я пытаюсь написать запрос plsql, который позволяет мне запрашивать набор известных значений, которые не хранятся в таблице. Скажите, что эти известные значения следующие строки:

  • а
  • Защита
  • ГХИ
  • JKL

Я бы хотел добиться чего-то вроде следующего:


select * from [fill-in-the-blank] myvalues 
where not myvalues in 
(
    select id from dbtable
)

.. где я пытаюсь выяснить, какие из этих известных значений отсутствуют в таблице базы данных.

Ограничения

  • Это пл / sql (оракул)
  • Это решение должно запускаться из Oracle PL / SQL Developer
  • У меня есть доступ только для чтения к схеме, поэтому я не могу создавать временные таблицы.

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 22 сентября 2011

Вы можете использовать Общее Табличное Выражение (CTE) для достижения этой цели:

with cte as (
    select 'abc' as id from dual
    union all
    select 'def' from dual
    union all
    select 'ghi' from dual
    union all
    select 'jkl' from dual
)
select * 
from cte
where not id in 
(
    select id from dbtable
)

На самом деле, вам может даже не понадобиться CTE вообще (хотя я считаю, что это помогает читабельности):

select * 
from (
    select 'abc' as id from dual
    union all
    select 'def' from dual
    union all
    select 'ghi' from dual
    union all
    select 'jkl' from dual
)
where not id in 
(
    select id from dbtable
)
0 голосов
/ 01 августа 2016

Старые темы я знаю, но никто не упомянул

select * from table(sys.dbms_debug_vc2coll('abc','def','ghi','jkl'));

Вам не обязательно использовать sys.dbms_debug_vc2coll, конечно. Доступные типы коллекций могут быть перечислены с помощью:

select c.owner, c.type_name, c.elem_type_name, c.length
from   all_coll_types c
where  c.coll_type = 'TABLE'
and    c.elem_type_name = 'VARCHAR2'
order by 1,2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...