Oracle SQL - найдите значения НЕ в таблице - PullRequest
11 голосов
/ 03 апреля 2012

Возьми этот стол СЛОВА

WORD
Hello
Aardvark
Potato
Dog
Cat

И этот список:

('Hello', 'Goodbye', 'Greetings', 'Dog')

Как мне вернуть список слов, которых нет в таблице слов, но есть в моем списке?

Если у меня есть таблица, которая «содержит все возможные слова», я могу сделать:

SELECT * from ALL_WORDS_TABLE
where word in ('Hello', 'Goodbye', 'Greetings', 'Dog')
and word not in 
(SELECT word from WORDS
where word in ('Hello', 'Goodbye', 'Greetings', 'Dog')
);

Однако у меня нет такой таблицы. Как еще это можно сделать?

Кроме того, создание новой таблицы не вариант, потому что у меня нет такого уровня доступа.

Ответы [ 3 ]

32 голосов
/ 03 апреля 2012

Вместо жесткого кодирования значений списка в строки, используйте DBMS_DEBUG_VC2COLL для динамического преобразования списка с разделителями в строки, затем используйте оператор MINUS, чтобы исключить строки во втором запросе, которых нет в первом запросе:

select column_value 
from table(sys.dbms_debug_vc2coll('Hello', 'Goodbye', 'Greetings', 'Dog'))
minus
select word
from words;
5 голосов
/ 03 апреля 2012

Вы можете превратить свой список в вид, подобный этому:

select 'Hello' as word from dual
union all
select 'Goodbye' from dual
union all
select 'Greetings' from dual
union all
select 'Dog' from dual

Тогда вы можете выбрать из этого:

select * from
(
    select 'Hello' as word from dual
    union all
    select 'Goodbye' from dual
    union all
    select 'Greetings' from dual
    union all
    select 'Dog' from dual
)
where word not in (select word from words);

Возможно, не такое изящное решение, как вы могли бы надеяться ...

Вы говорите, что у вас недостаточно прав для создания таблиц, поэтому, вероятно, вы также не можете создавать типы - но если вы можете найти подходящий тип "валяющийся" в вашей базе данных, вы можете сделать это:

select * from table (table_of_varchar2_type('Hello','Goodbye','Greetings','Dog'))
where column_value not in (select word from words);

Здесь table_of_varchar2_type представляет собой имя типа, который определен как:

create type table_of_varchar2_type as table of varchar2(100);

Один такой тип, который вы, вероятно, сможете найти, это SYS.KU$_VCNT, который представляет собой TABLE OF VARCHAR2 (4000).

4 голосов
/ 03 апреля 2012

Попробуйте это решение:

SELECT
 a.word
FROM
(
 SELECT 'Hello' word FROM DUAL UNION
 SELECT 'Goodbye' word FROM DUAL UNION
 SELECT 'Greetings' word FROM DUAL UNION
 SELECT 'Dog' word FROM DUAL
) a
LEFT JOIN ALL_WORDS_TABLE t ON t.word = a.word
WHERE
 t.word IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...