选择 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的主要内容,如果未能解决你的问题,请参考以下文章