【发布时间】:2012-03-02 11:32:13
【问题描述】:
我有一个 860 项长的项目列表。当我执行查询时:select * from tableA where item in (... items ...) 我得到 858 个项目。我想知道列表中不在 tableA 中的 2 项。
不返回表中所有不在列表中的项目,我想要列表中所有不在表中的项目。
【问题讨论】:
-
您使用的是哪个数据库? mysql?后勤?甲骨文?
我有一个 860 项长的项目列表。当我执行查询时:select * from tableA where item in (... items ...) 我得到 858 个项目。我想知道列表中不在 tableA 中的 2 项。
不返回表中所有不在列表中的项目,我想要列表中所有不在表中的项目。
【问题讨论】:
根据我对问题的最初理解,我建议只添加关键字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
【讨论】: