0

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

NOT 返回表中所有不在列表中的项目,我想要列表中不在表中的所有项目。

4

2 回答 2

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)
于 2012-02-09T23:04:17.530 回答
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

看看它在行动:https ://data.stackexchange.com/stackoverflow/query/61259/items-not-returned-from-a-list

于 2012-02-09T23:28:19.667 回答