我有一个“服务器”表,在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);
有人有其他更好的方法吗?感谢。
答案 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)
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
是一个更好的选择。