3

在过去的几分钟里,这一直让我发疯

我有一张桌子,可以说 table_alphabet 有三列。

letter(pri)  col1   col2   
a            24     55
b            45     45
c            23     44
...
y            33     55
z            45     22 

现在在我的应用程序中,我有一个列表('a'、'b'、'lol'、'cats'、'z'、'foo')。

如果我做

SELECT letter FROM table_alphabet WHERE letter IN ('a', 'b', 'lol', 'cats', 'z', 'foo')

我只得到行,(a,b,z)

我想要的是得到'lol','cats','foo'。或者用英语,我的列表中的哪些项目从表中丢失。

任何帮助将不胜感激,我今天似乎有脑部故障。

4

3 回答 3

0

我可能完全偏离了基础,但我认为您不会仅在 SQL 中实现这一目标。

现在,如果您将列表加载到表中,将其命名为 table_list,然后将其加入您的 table_alphabet 并排除所有字母为空的行,那么您可以获得排除列表。

于 2009-07-08T19:44:43.513 回答
0

对不起,我第一次完全误解了这个问题。您将需要一个可以将列表中的所有字母作为行提取的子查询。我能想到的唯一方法是将它们联合在一起:

select let from (select 'a' as let union select 'b' as let union select 'lol' as let union select 'cats' as let union select 'z' as let union select 'foo' as let) as innerletters where let not in (select letter from table_alphabet);

因此,换句话说,您的应用程序将需要获取列表“ ('a', 'b', 'lol', 'cats', 'z', 'foo')”并在 UNION 中重写它:

(select 'a' as let union select 'b' as let union select 'lol' as let union select 'cats' as let union select 'z' as let union select 'foo' as let)

...并将其插入查询中。这应该返回列表中不存在于 table_alphabet 表的字母列中的字母:

+------+
| let  |
+------+
| lol  |
| cats |
| z    |
| foo  |
+------+
于 2009-07-08T19:56:55.097 回答
-3

NOT IN 命令甚至适用于您要过滤的非静态列表。您可以使用如下子查询:

select letter from table_alphabet where letter NOT IN ( select letter from exclude_table )
于 2009-07-08T19:42:52.910 回答