选择不存在的东西

时间:2010-05-22 03:08:31

标签: mysql select

我有这张桌子。我想选择已经不存在的项目,所以我可以创建它们。

table tags
+---------+-------+
| tagId   | name  |
|   1     | C     |
|   2     | DX    |
|   3     | CG    |

说SQL看起来像:

select name from tags where name in ( 'C', 'CG', 'RX' )

您返回'C''CG',因此您知道必须创建'RX'

'RX'尚不存在时,有没有办法让这样的MySQL语句返回'RX'

2 个答案:

答案 0 :(得分:4)

假设您的标签('c','cg','rx')位于名为tags_match的表格中,其结构与上述相同

然后你可以这样做:

select tr.name 
from tags as tl 
    right join tags_match as tr 
    on tl.name = tr.name
where tl.name is null

这会找到tags_match中不在标签中的所有项目,因此这会为您提供所需的结果,但不幸的是您的标签('c','cg','rx')不在表中:(

无论我们可以使用子查询来“伪造”表格

select tr.name 
from tags as tl 
    right join (select 'cg' as name 
                union select 'c' as name 
                union select 'rx' as name) as tr 
    on tl.name = tr.name
where tl.name is null

虽然它有点难看,但这样可行。如果您要测试许多项目,可能需要考虑创建一个真正的临时表。

答案 1 :(得分:1)

当然!

select name from tags where name not in ( 'C', 'CG', 'RX' )

唯一的问题是,如果not in列表很长,则此查询会很慢,因为它必须针对每行的'name'字段检查每个元素,以确定是否它不在列表中,而不是in,当它匹配时,它将停止在该点检查列表并返回该行。


编辑:上述解决方案有误。我很抱歉。真正的解决方案如下。

以下是在一行SQL中执行此操作的方法:

select name from (
    select "C" as name
    union select "CG"
    union select "RX"
) as foo
where name not in (select name from tags);