0

我有一个独特的专栏。我还有一组已知的元素,它们是列的可能值。我需要知道哪些可能的值尚未在表中,因此适合插入。

这可以通过 SQL 实现还是需要后处理?

目前,我正在使用“in”运算符来选择列值等于我的集合中的一个元素的所有行。然后我通过后处理从我的集合中删除所有匹配的元素。

4

2 回答 2

1

要完全在 SQL 中执行此操作,您需要创建一个包含一列的单独表。每行包含一个已知元素集合中的一个值。假设该表称为 ElementList 而另一个表称为 Existing:

 SELECT * FROM ElementList WHERE Element NOT IN 
    (SELECT DISTINCT Element FROM Existing)

根据您使用的数据库引擎,您可以使用临时表来创建和保存列表,而无需将其永久保存在数据库中。但是,存储允许元素的列表对于限制现有表中的元素列(以及在用户界面中向用户显示允许的元素)是有价值的。

于 2012-10-03T17:18:00.990 回答
1

将允许的值粘贴在临时表中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语法来做同样的事情。

于 2012-10-03T17:18:43.947 回答