2012-02-09 2 views
0

У меня есть список товаров длиной 860 единиц. Когда я выполняю запрос: select * from tableA where item in (... items ...) Я получаю 858 элементов. Я хотел бы знать два элемента в списке, которые не находятся в таблице.Элементы, не возвращенные из списка

НЕ возвращает все элементы в таблице, которых нет в списке, я хочу, чтобы все элементы в списке не были в таблице.

+0

, какую базу данных вы используете? MySQL? Postgres? оракул? – Bohemian

+0

@Bohemian Oracle 10g – Mike

ответ

1

Я рекомендовал бы вам преобразовать список в временную таблицу (есть тонна UDF, плавающие вокруг, что вы можете использовать например: http://blog.sqlauthority.com/2007/05/06/sql-server-udf-function-to-convert-list-to-table/)

После того, как у вас есть таблица #List Темп, вы можете сделайте следующее;

CREATE TABLE #List 
(
    [ListItem] INT 
) 

SELECT 
    * 
FROM 
    #List AS l 
LEFT OUTER JOIN 
    tableA AS t 
ON 
    t.[Item] = l.[ListItem] 
WHERE 
    t.[Item] IS NULL 

в действии: http://data.stackexchange.com/stackoverflow/query/61259/items-not-returned-from-a-list

1

Основываясь на моем первоначальном понимании этого вопроса, я предложил, чтобы просто добавить ключевое слово NOT

SELECT * FROM tableA WHERE item NOT IN (... items ...) 

Но за комментарием выше, не будет возвращать то, что вы хотите. Исходный вопрос был изменен, чтобы включить эту новую информацию.

Итак, вам нужно получить данные из предложения WHERE в форму, которая запрашивается. Вот один из способов сделать это, когда я создаю дополнительную таблицу с именем «items» и имеют инструкции INSERT для размещения каждого элемента в этой таблице элементов. Поскольку у меня нет доступа к вашим данным, я собираюсь использовать целые числа для элементов и настроить их с меньшим объемом данных.

--Set up some sample data 
CREATE TABLE tableA(item INT PRIMARY KEY) 

INSERT INTO tableA SELECT 1 
INSERT INTO tableA SELECT 2 
INSERT INTO tableA SELECT 3 
INSERT INTO tableA SELECT 4 
INSERT INTO tableA SELECT 9 
INSERT INTO tableA SELECT 10 

SELECT * FROM tableA WHERE item IN (0,1,2,3,4,5,6) 
SELECT * FROM tableA WHERE item NOT IN (0,1,2,3,4,5,6) 

-- Create a table and insert all the 860 items from your where clause 
CREATE TABLE items(item INT) 
INSERT INTO items SELECT 0 
INSERT INTO items SELECT 1 
INSERT INTO items SELECT 2 
INSERT INTO items SELECT 3 
INSERT INTO items SELECT 4 
INSERT INTO items SELECT 5 
INSERT INTO items SELECT 6 

-- Want to find a query that returns all of the items in the newly created items table 
-- that are not in the original tableA (in this example, the values returned are 0,5,6) 
SELECT * FROM items WHERE item NOT IN (SELECT item FROM tableA) 
+0

, который возвращает все элементы в таблице, которых нет в списке, а не все элементы в списке, отсутствующие в таблице. – Mike

+0

Ваша проблема не совсем определена. tableA может содержать 858 записей, для которых все они имеют одинаковое значение для своего поля, и вы бы вернули 858 записей. Проблема в письменной форме предполагает, что в списке есть 2 элемента, которые не находятся в таблице A, но их может быть много. –

+0

Таблица A содержит сотни тысяч предметов. Элемент уникален. – Mike