【发布时间】:2015-05-04 22:35:21
【问题描述】:
取一个如下结构的表:
ID, Email, Name
给了我一个电子邮件列表,我需要找出:表格中存在哪些电子邮件,哪些不存在。对于在场的人,请返回每封电子邮件的相应 ID。
我希望使用尽可能少的 SQL 语句来实现这一点。
两个问题:
由于我需要将每个给定的电子邮件与一个 ID(如果存在)相匹配,因此返回的 ID 的顺序必须允许我将它们分别与给定的电子邮件相匹配。如果我们做一个简单的
SELECT ID FROM Table WHERE Email IN (...),结果的顺序可能与IN子句给出的电子邮件列表的顺序不匹配(至少对于SQLite)。普通的
SELECT ... WHERE ... IN ()语句也不会直接告诉您哪些电子邮件不存在。我在 SQLite 中尝试过以下操作,但它运行时并没有给我我想要的:SELECT COALESCE(ID, -1) AS UID, Email FROM Table WHERE Email IN (...):它只返回匹配的记录。
一个简单的解决方案是运行与给定电子邮件数量一样多的SELECT,每个电子邮件一个,这样您就可以知道每封电子邮件是否存在记录,如果存在,ID 是什么。但是,如果电子邮件数量很大,这可能会导致性能问题,尤其是考虑到 SQL 服务器的客户端-服务器通信开销时。
我对 SQLite 的解决方案以及大型 SQL 服务器的等效解决方案感兴趣。
【问题讨论】:
-
在表中插入值列表,然后使用左连接
标签: sql postgresql sqlite