我有一个独特的专栏。我还有一组已知的元素,它们是列的可能值。我需要知道哪些可能的值尚未在表中,因此适合插入。
这可以通过 SQL 实现还是需要后处理?
目前,我正在使用“in”运算符来选择列值等于我的集合中的一个元素的所有行。然后我通过后处理从我的集合中删除所有匹配的元素。
我有一个独特的专栏。我还有一组已知的元素,它们是列的可能值。我需要知道哪些可能的值尚未在表中,因此适合插入。
这可以通过 SQL 实现还是需要后处理?
目前,我正在使用“in”运算符来选择列值等于我的集合中的一个元素的所有行。然后我通过后处理从我的集合中删除所有匹配的元素。
要完全在 SQL 中执行此操作,您需要创建一个包含一列的单独表。每行包含一个已知元素集合中的一个值。假设该表称为 ElementList 而另一个表称为 Existing:
SELECT * FROM ElementList WHERE Element NOT IN
(SELECT DISTINCT Element FROM Existing)
根据您使用的数据库引擎,您可以使用临时表来创建和保存列表,而无需将其永久保存在数据库中。但是,存储允许元素的列表对于限制现有表中的元素列(以及在用户界面中向用户显示允许的元素)是有价值的。
将允许的值粘贴在临时表中allowed
,然后使用子查询NOT IN
:
SELECT *
FROM allowed
WHERE allowed.val NOT IN (
SELECT maintable.val
)
一些数据库将允许您“就地”构建表,而不必创建单独的表。例如在 PostgreSQL(任何版本)中:
SELECT *
FROM (
SELECT 'foo'
UNION ALL SELECT 'bar'
UNION ALL SELECT 'baz' -- etc.
) inplace_allowed
WHERE inplace_allowed.val NOT IN (
SELECT maintable.val
)
更现代的 PostgreSQL 版本(可能还有其他数据库)将允许您使用稍微更好的VALUES语法来做同样的事情。