2016-08-03 3 views
2

Пусть предположим После простой таблицыВыясните значения, которые не доступны в таблице

Col1 
====== 
one 
two 

Пусть предположим После простого запроса

Select count(*) from TABLE_A where Col1 in ('one','two','three','four') 

В приведенном выше запросе он будет производить следующий результат

2 

Теперь я хочу узнать, какие значения в IN-состоянии недоступны в таблице_A.

Как узнать, какие значения недоступны в таблице?

как результат ниже

three 
four 

Выше запросов только пример. В моем запросе в реальном времени у 1000 значений в IN-Condition.

Работа База данных: DB2

+0

Если 1000 значений в 'состоянии в' то, вы можете добавить таблицу и сохранить в нем все 1000 записей.Затем, используя 'LEFT JOIN' с' NULL', вы можете легко найти несоответствующие записи – Arulkumar

+0

@Arulkumar. я уже знал об этом методе. Мне нужен другой метод. –

+0

Может ли синтаксис-альтернатива для спецификации VALUES() достаточным как _any other_ method? Когда этот IN-предикат состоит как [или эффективно; Я не могу проверить синтаксис непоследовательного подзапроса] 'Col1 in (значения ('one'), ('two'), ('three'), ('four'))', тогда тот же синтаксис можно было бы использовать в ЗА ИСКЛЮЧЕНИЕМ запроса [или аналогичного эффекта EXCEPTION JOIN к уже предложенному LEFT JOIN]. – CRPence

ответ

3

Это один из работы вокруг, чтобы достичь ваших ожиданий.

Вместо жесткого кодирования значения в IN условии вы можете переместить эти значения в таблицу. Если это делается просто с помощью LEFT JOIN с NULL, вы можете получить не соответствующие значения.

SELECT MR.Col1 
FROM MatchingRecords MR -- here MatchingRecords table contains the IN condition values 
LEFT JOIN Table_A TA ON TA.Col1 = MR.Col1 
WHERE TA.Col1 IS NULL; 

Working DEMO

-1

Если значения должны быть перечислены в строке заявления, а не хранится в таблице, а затем, возможно, пересмотр синтаксиса используется для этого списка значений в настоящее время в составе [ по-видимому, из некоторого другого ввода, кроме TABLE] для предиката IN, может быть осуществлено? Следующий пересмотренный синтаксис для списка значений может быть использован как для исходного агрегированного запроса [показан ниже, так и для первого из двух запросов], так и для запроса, для которого запрашивается способ ввода кода [вторая из два запроса ниже]:

Select count(*) 
from TABLE_A 
where Col1 in (values('one'),('two'),('three'),('four')) 
; -- report from above query follows: 
COUNT (*) 
      2 


[Bgn-Edit 05-Август-2016: добавить этот текст и пример чуть ниже]
, по-видимому, по крайней мере один вариант DB2 брусьев на безымянных столбцов для производной таблицы, поэтому запрос чуть ниже имен столбца; Я выбрал COL1, чтобы соответствовать имени из фактического TABLE, но это не обязательно. (col1) добавлен в исходный запрос, который остается из исходной версии предварительного редактирования; эта версия остается после этого редактирования \ вставки и пропускает (col1) добавил здесь:

select * 
from (values('one'),('two'),('three'),('four')) as x (col1) 
except (select * from table_a) 
; -- report from above query follows: 
COL1 
three 
four 


Ниже приводится оригинальный данный запрос, для которого ниже комментарий предполагает отказ для безымянных колонков при запуске на некоторой неустановленной DB2 вариант; Я должен отметить, что этот SQL запрос функции без ошибок, на DB2 для я 7,1
[End-Edit 05-августа-2016]

select * 
from (values('one'),('two'),('three'),('four')) as x 
except (select * from table_a) 
; -- report from above query follows: 
VALUES 
three 
four 
+0

Ваш запрос дает ошибку, например: «Имя столбца не указано для столбца 1« x ». @CRPence –

+0

Что отображается без ошибок в IBM DB2 for i SQL с IBM i 7.1. Тем не менее синтаксис для обозначения столбцов для производной таблицы представляет собой скобковый список столбцов, следующий за AS-идентификатором. Я отредактирую ответ, чтобы включить это – CRPence