2016-12-08 4 views
0

데이터를 가져오고 전자 메일을 보내는 프로그램이 있습니다. 나는 smtp 이메일 로그 정보를 저장하는 또 다른 프로세스를 가지고있다.고유 키가없는 두 테이블에 결합하십시오.

예를 들어 사용자에게 정보를 제공 할 수 있도록보고하기 위해 이메일 로그를 사용합니다. 반송 등 ...

내가 가진 문제는 사용자가 이메일 정보의 다른 테이블에 저장된 계정 번호를 원한다는 것입니다. 즉, smtp 이메일 로그가 아닙니다.

현재 두 테이블을 함께 묶을 수있는 유일한 방법은 전자 메일 주소와 날짜입니다. 이것은 정확한 계좌 번호를 찾을 수있는 대부분의 시간입니다.

동일한 날에 같은 이메일 주소를 사용하는 다른 계정에서 3 개의 이메일을 보낼 수있는 곳이 문제입니다. 예 : 나는 두 개의 테이블을 조인 할 때

Account number Email Address  Date 
---------------------------------------------- 
1    [email protected] 9/12/2016 
2    [email protected] 9/12/2016 
3    [email protected] 9/12/2016 

다음과 같다 : -

select l.event, l.[time], l.SendTime, l.Recipient, e.AccountNumber from emaillog l 
OUTER APPLY 
(SELECT TOP 1 AccountNumber from emailData e 
where e.EmailAddress = l.Recipient and Convert(date, [DateEmailed]) = Convert(date, l.Time) 
) as e 
where Convert(date, l.Time) = '2016-12-09'; 

그것은 항상 내 이메일 테이블의 첫 번째 레코드를 찾습니다 즉 내가

Account number Email Address  Date 
--------------------------------------------- 
1    [email protected] 9/12/2016 
1    [email protected] 9/12/2016 
1    [email protected] 9/12/2016 

을 가지고 있기 때문에 이메일 주소와 날짜 시합.

정확한 계좌 번호를 다시받을 수있는 방법이 있습니까? 나는 이메일 로그에서 임시 테이블을 생성하는 SP를 작성하는 생각 못했다

는 다음 여러 항목을 발견 이메일 데이터 테이블에서 행 1의 계좌 번호의 로그 행은 1 같은 것을 말한다.

내가 SQL 트릭을 놓친 지 궁금하다.

+0

정말로 사용하고있는 데이터베이스에 질문을 태그하십시오. –

+0

나는 비 표준'에 따라'SQL-server' 태그를 추가 [..]'와'외부 apply' –

+0

죄송합니다, 예는 SQL-서버 –

답변

-1

대신, 제안, 이메일 및 응답을 열거 :

select l.event, l.[time], l.SendTime, l.Recipient, ed.AccountNumber 
from (select l.*, 
      row_number() over (partition by recipient, Convert(date, [DateEmailed] order by dateemailed) as seqnum 
     from emaillog as l 
    ) as l left join 
    (select ed.* 
      row_number() over (partition by recipient, Convert(date, [time] order by time) as seqnum 
     from emaildata as ed 
    ) as ed 
    on ed.EmailAddress = l.Recipient and ed.seqnum = l.seqnum 
where Convert(date, l.Time) = '2016-12-09';    
+0

익명 downvote에 대한 이유가 무엇입니까? 대답에 대한 문제점은 무엇입니까? –

+0

안녕하세요. 코드가 작동하지 않는 것 같습니다. 예를 들어 구문 오류가 있습니다. 메시지 156, 수준 15, 상태 1, 줄 3 'order'키워드 근처의 구문이 잘못되었습니다. 메시지 102, 수준 15, 상태 1, 줄 7 'row_number'근처의 구문이 잘못되었습니다. –

+0

@AceGrace 어떤 SQL Server 버전을 사용하고 있습니까? 혹시 2008R2 또는 그 이전입니까? –

0

일부 구문 문제가 있었다 나는 수정 된 코드를 게시하지만 올바른 방향으로 날 가리키는 주셔서 감사합니다 있도록. 나는 SQL 서버로 꽤 녹슬다.

select l.event, l.[time], l.SendTime, l.Recipient, ed.AccountNumber 
from (select l.*, 
      row_number() over (partition by recipient, Convert(date, [time]) order by [time]) as seqnum 
     from emaillog as l 
    ) as l left join 
    (select ed.*, 
      row_number() over (partition by emailaddress, Convert(date, [DateEmailed]) order by [DateEmailed]) as seqnum 
     from ebilldata as ed 
    ) as ed 
    on ed.EmailAddress = l.Recipient and ed.seqnum = l.seqnum 
where Convert(date, l.Time) = '2016-12-06';