我有一张这样的表:
People
-----------------
email_address
created_date
我还有一个电子表格,里面有大约60,000个电子邮件地址。我需要为电子表格中的每个电子邮件地址选择“created_date”。我目前接近它的方法是使用IN子句创建一个大的select语句:
SELECT email_address, created_date FROM People WHERE email_address in (
'user1@something.com',
'user2@something.com',
'user3@something.com',
...
这个问题是它是一个巨大的脚本(60,000多行),我甚至无法让它运行,因为错误如“得到的数据包大于'max_allowed_packet'字节”和“MSQL Server已经消失离开”。
我可以通过增加max_allowed_packet等来修复这些错误,但我觉得它可能只是我的SQL很糟糕的症状,而不仅仅是处理症状,我应该解决问题并写得更好SQL。如果您有任何建议,请告诉我们!
答案 0 :(得分:5)
将电子邮件地址加载到单独的一列表中并使用
SELECT email_address, created_date FROM People
WHERE email_address IN (SELECT email_address FROM email_table)
答案 1 :(得分:1)
首先创建一个Addresses表,包括索引
CREATE TABLE Addresses (addr char(255) primary key);
在脚本中插入地址
INSERT INTO Addresses VALUES ('address1'),('address2'),...;
如果需要,你可以分解插入(大脚本)
INSERT INTO Addresses VALUES ('address1'),('address2');
INSERT INTO Addresses VALUES ('address3'),('address4');
...
然后您可以轻松快速地搜索人员表
SELECT p.email_address, p.created_date
FROM People as p JOIN Addresses as a ON p.email_address=a.addr;