2011-01-10 6 views
2

의 데이터가 나는 테이블과 같이 있습니다- 스프레드 시트

People 
----------------- 
email_address 
created_date 

나는 또한 약 6 만 전자 메일 주소와 스프레드 시트를 가지고있다. 스프레드 시트에서 각 전자 메일 주소에 대해 "created_date"를 선택해야합니다. 나는 현재를 접근하고 방법은 IN 절과 하나의 큰 선택 문을 만드는 것입니다 :

SELECT email_address, created_date FROM People WHERE email_address in (
'[email protected]', 
'[email protected]', 
'[email protected]', 
... 

이의 문제는 거대한 스크립트 (60,000 라인)이며, 심지어 그것을 얻을 수 없다는 것입니다 "max_allowed_packet '바이트보다 큰 패킷을 얻었으며"MSQL 서버가 없어졌습니다 "와 같은 오류로 인해 실행됩니다.

나는 이러한 오류를 max_allowed_packet 등을 늘림으로써 해결할 수 있을지 모르지만, 나는 그것이 단지 SQL이 짜증나는 증상일지도 모르며 단지 증상을 치료하는 대신 문제를 해결하고 작성해야한다고 생각한다. 더 나은 SQL. 의견이 있으면 알려주세요.

답변

5

로드 이메일 별도의 하나 개의 컬럼 테이블에 주소와 인덱스

CREATE TABLE Addresses (addr char(255) primary key); 

삽입을 포함, 먼저 주소 테이블을 작성

SELECT email_address, created_date FROM People 
    WHERE email_address IN (SELECT email_address FROM email_table) 
+0

감사를 검색 할 수 있습니다! SQL에서 강하지 않다, 당신은 임시 테이블에 삽입하기 위해 큰 INSERT 문을 쓰는 것을 의미합니까? 아니면 대량의 데이터를 삽입하는 다른 방법이 있습니까? – JasonStoltz

+0

아마도 가장 간단한 방법은 스프레드 시트의 전자 메일 열을 텍스트 파일로 저장하고 일부 MySQL 관리 프로그램을 사용하여 텍스트 또는 csv (단 하나의 열만 있음)로로드하는 것입니다. IIRC MySQL은 테이블을 위해 별도의 파일을 사용하기 때문에 전체 데이터베이스에 영향을 미치지 않고 테이블을 추가하고 제거 할 수 있습니다. –

+0

좋습니다, 감사합니다. 사실,이 경우 다른 곳으로 옮길 수있는 스크립트를 만들어야합니다. 가능한 한 쉽게 만들기 위해 모든 관리 도구 사용을 피할 것입니다. – JasonStoltz

1

를 사용하는 스크립트의 주소

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; 
+0

나는 이런 식으로 sql을 사용했다. 그러나 원래 열의 순서를 유지해야하므로 "addr"열을 선언하지 않았으므로이 열을 인덱스로 만들지 않았습니다. – JasonStoltz

관련 문제