选择 where 子句中未找到的 ID

Posted

技术标签:

【中文标题】选择 where 子句中未找到的 ID【英文标题】:Select IDs not found in where clause 【发布时间】:2014-08-22 16:25:20 【问题描述】:

假设我有一个问题:

SELECT * FROM Parts WHERE PartID IN (id1, id2, id3, id4, id5);

如何选择我提供的在 Parts 中找不到的 ID?

我猜是这样的:

SELECT (id1, id2, id3, id4, id5) WHERE NOT IN Parts.PartID

我不想从零件表中进行选择。我正在尝试从我的 ID 数组中进行选择,并将其与 Parts 表进行比较,以从 ID 数组中找到不在 Parts 表中的 ID。假设 Parts 表中有 id2、id3、id4,查询将返回 id1 和 id5

【问题讨论】:

【参考方案1】:

您可以使用这样的单个查询来完成此操作,并带有反连接:

SELECT ids.id FROM (SELECT 'id1' AS id
                    UNION SELECT 'id2'
                    UNION SELECT 'id3'
                    UNION SELECT 'id4'
                    UNION SELECT 'id5') ids
LEFT JOIN Parts p
  ON p.PartID = ids.id
WHERE p.PartID IS NULL

【讨论】:

@wilsotobianco,这通常比“WHERE ... NOT IN ...”表现更好【参考方案2】:

试试类似的东西

SELECT * FROM Parts WHERE PartID NOT IN (id1, id2, id3, id4, id5);

或许

SELECT * FROM Parts WHERE PartID NOT EXISTS (id1, id2, id3, id4, id5);

【讨论】:

这会给出在我的 id 数组中找不到的部分的 ID。我想要不在部件表中的 id 数组中的 id。 您没有正确解释自己,在不同的表中是否有另一个名为 ID 的字段?因为那你必须使用某种形式的 JOIN 对不起;让我再试一次。我有一个数组,我有 ID,我想找出哪些 ID 不在数据库中。如果我执行 NOT IN,我会得到 Parts 表中的 ID,而不是 ID 数组中的 ID。我想要相反的,ID 数组中的 ID 不在 Parts 表中。希望这是有道理的。【参考方案3】:

你错过了提供表名

  SELECT * FROM Parts WHERE PartID NOT IN (id1, id2, id3, id4, id5);

或者试试这样:

 select * from parts 
 where partid not in(SELECT ID FROM Parts WHERE PartID NOT IN (id1, id2, id3, id4, id5));

【讨论】:

这将显示与提供的列表不匹配的部分,而不显示提供的列表中的哪些与表格不匹配,我相信这是 OP 要求的。 这会给出在我的 id 数组中找不到的部分的 ID。我想要不在部件表中的 id 数组中的 id。 @LeeJacobson:- 更新了我的答案。那是你要找的吗?否则请解释更多? @R.T.那还是不对。我不想从零件表中进行选择。我正在尝试从我的 ID 数组中进行选择,并将其与 Parts 表进行比较,以从 ID 数组中找到不在 Parts 表中的 ID。假设 Parts 表中有 id2、id3、id4,查询将返回 id1 和 id5 @LeeJacobson:- SQL Server 不支持数组。你能说出你是如何存储你的 ID 数组的吗?【参考方案4】:
SELECT ID FROM Parts WHERE PartID != 'id1' AND PartID != 'id2'... etc

现在,如果您从 C# 中传递一个动态数组,则必须进行一些字符串处理和一个 for 循环(针对每个 id)来创建 SQL 语法,这实际上相当简单。

我知道这基本上是硬编码...但这似乎是最简单的方法。

【讨论】:

【参考方案5】:

您需要一个表对象或子查询中的 ID 列表,然后您可以查询:

CREATE TEMPORARY TABLE IF NOT EXISTS table1 AS (
SELECT 'id1' AS PartID
UNION
SELECT 'id2'
UNION 
SELECT 'id3'
UNION
SELECT 'id4'
UNION 
SELECT 'id5'
)

然后您可以使用NOT EXISTS 从列表中查找不在Parts 表中的项目:

SELECT *
FROM Table1 a
WHERE NOT EXISTS (SELECT *
                  FROM Parts b
                  WHERE a.PartID = b.PartID)

我不太了解 mysql,也不太了解您的列表是如何被引入查询的,但您可能会比手动创建它更优雅地将数组转换为表。

【讨论】:

以上是关于选择 where 子句中未找到的 ID的主要内容,如果未能解决你的问题,请参考以下文章

在 WHERE 或 FROM 子句中进行子选择?

嵌套选择中的 WHERE 子句

从表中选择 WHERE 子句中具有不同 IN 列表的表

MySQL:当 WHERE 找到相似条目时选择最高列值

选择不同的值,传递到 Where 子句

MySQL在where子句中选择查询