如何在mysql中轻松获得无与伦比的条件

时间:2010-06-12 12:34:29

标签: mysql

我有一个“服务器”表,在mysql中有一个名为“SN”的列,当查询用一些sns从“sn1”到“sn10000”的服务器进行检索时,我们可以:

select * from server where sn in ('sn1','sn2','sn3',...'sn10000');

如果'sn1'中只有一个sn - 数据库中不存在'sn10000',则上面的查询将检索9999行结果。

问题是如何在'sn1'中轻松获取哪一个 - 除了额外的工作外,数据库中不存在'sn10000',例如使用shell脚本等处理结果。

我有一个像下面这样丑陋的sql可以使用:

select * from (select 'sn1' as sn 
        union select 'sn2' 
        union select 'sn3'
        ....
        union select 'sn10000') as SN 
where not exists (select id from server where server.sn=SN.sn);

有人有其他更好的方法吗?感谢。

2 个答案:

答案 0 :(得分:1)

将sn1,sn2,sn3 ... sn10000值粘贴到临时表中,然后使用连接。

Select server.* from server inner join tempt on (tempt.value = server.sn)

将为您提供匹配的内容,其中

Select sn.* from server right outer join tempt on (tempt.value = server.sn) 
where server.somefield is Null

应该注意找到遗失的那些。

答案 1 :(得分:1)

您的查询完全适合预期用途,但on MySQL the NOT IN and LEFT JOIN/IS NULL are more effecient that NOT EXISTS。以下是您的备选方案:

不在

SELECT * 
  FROM (          SELECT 'sn1' as sn 
        UNION ALL SELECT 'sn2' 
        UNION ALL SELECT 'sn3'
        ....
        UNION ALL SELECT 'sn10000') as SN 
 WHERE sn.sn NOT IN (SELECT s.id FROM SERVER s)

LEFT JOIN / IS NULL

   SELECT s.id
     FROM SERVER s
LEFT JOIN (          SELECT 'sn1' as sn 
           UNION ALL SELECT 'sn2' 
           UNION ALL SELECT 'sn3'
           ....
           UNION ALL SELECT 'sn10000') as SN ON SN.sn = s.id
    WHERE sn.sn IS NULL

您可能会注意到我使用了UNION ALL,而不是UNION - UNION删除了重复项(在您的示例中不会发生),使其变慢,因此UNION ALL是一个更好的选择。