未从列表返回的项目

时间:2012-02-09 23:02:56

标签: sql select where-in

我有一个项目列表,长度为860项。当我执行查询时:select * from tableA where item in (... items ...)我得到了858个项目。我想知道列表中不在tableA中的2个项目。

NOT不返回表中不在列表中的所有项目,我希望列表中的所有项目都不在表格中。

2 个答案:

答案 0 :(得分:1)

根据我对该问题的原始理解,我建议只添加关键字NOT

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

但根据评论,上述内容不会返回您想要的内容。编辑原始问题以包括这种新的信息。

因此,您需要将WHERE子句中的数据转换为可查询的表单。这是一种方法,我创建一个名为“items”的附加表,并使用INSERT语句将每个项放入此items表。由于我无法访问您的数据,因此我将对项目使用整数,并使用较少的数据进行设置。

--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)

答案 1 :(得分:1)

我建议您将列表转换为临时表(有大量的udfs可以使用ex: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