【问题标题】:Items not returned from a list未从列表中返回的项目
【发布时间】:2012-03-02 11:32:13
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是哪个数据库? mysql?后勤?甲骨文?

标签: sql select where-in


【解决方案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)

【讨论】:

  • 返回表中所有不在列表中的项目,而不是列表中所有不在表中的项目
  • 您的问题没有明确定义。 tableA 可以包含 858 条记录,它们的 item 字段的值都相同,您将返回 858 条记录。所写的问题假定列表中有 2 个项目不在 tableA 中,但可能还有更多。
  • 表 A 包含数十万个项目。项目是独一无二的。
  • “items”实际上是一个列表还是另一个查询的结果集?
  • 好的。我已经删除了-1。我看到你已经大大编辑了答案。本质上,您需要某种包含所有值的参考表。您的答案使用表格。更好的选择是 临时 表。另一个更好的选择是使用一个您知道所有值都存在的表(没有提供问题,但如果存在,您可以建议使用查找表)和一个相当简单的连接。您的解决方案会起作用,但它并不优雅。尽量避免创建表只是为了运行查询,除非真的没有其他方法(有时没有其他方法)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多