Предметы не возвращены из списка - PullRequest
0 голосов
/ 10 февраля 2012

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

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

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Я бы порекомендовал вам преобразовать ваш список во временную таблицу (существует масса 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 голос
/ 10 февраля 2012

Исходя из моего первоначального понимания вопроса, я предложил просто добавить ключевое слово 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)
...