我有一个 860 项长的项目列表。当我执行查询时:select * from tableA where item in (... items ...)
我得到 858 个项目。我想知道列表中不在 tableA 中的 2 个项目。
NOT 返回表中所有不在列表中的项目,我想要列表中不在表中的所有项目。
根据我对问题的最初理解,我建议只添加关键字 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)
我建议您将列表转换为临时表(您可以使用大量的 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