2016-05-24 16 views
0

Ich bin sehr neu mit SQL, wie Sie sehen können, und ich habe Zweifel über die Iteration mit 2 Tabellen. HierIteration zwischen 2 Tabellen SQL Query

ist das Ding:

Ich habe zwei Tabellen "UsersEmails" und "Sent_Emails".

In der "UsersEmail" habe ich alle E-Mails (Benutzeraccounts) und in den "Sent_Emails" habe ich die E-Mails während eines Zeitraums zB "HEUTE" gesendet.

Also, ich möchte wissen, welche E-Mail-Konto in meiner "UsersEmail" -Tabelle wo HEUTE gesendet wurde und welche nicht waren.

Ich bekam eine Idee, indem ich jede E-Mail in meiner Tabelle "UsersEmail" wiederholte und auf der Tabelle "Email_Sent" nachprüfte, aber ich weiß nicht, wie ich das machen soll.

Ich hoffe, Sie könnten mir dabei helfen.

Meine besten Grüße.

+0

Was Sie wahrscheinlich wollen, ist ein 'LINKER JOIN', aber welche DBMS verwenden Sie? dh. SQL Server, Oracle usw. Welche Beziehung besteht zwischen "UsersEmail" und "Sent_Emails"? Gibt es ein entsprechendes ID-Feld oder einfach nur die E-Mail-Adressen? –

+0

Für das Protokoll ist "iterating" gegen die Kernprinzipien wie SQL funktioniert. Stattdessen denke "Sätze" ... "Ich muss eine Reihe von ..." oder "Ich muss auf einer Reihe von ...". Das Denken in Bezug auf Iterationen kann zu einer ernsthaften Einschränkung und zu einem schwierigen Block für das effektive Erlernen von SQL werden (da gewesen, das getan ...). – jleach

Antwort

0

Sie gab wenig Informationen über Ihre Tabellen aber angeblich kann man schreiben:

gesendet heute:

select * from UsersEmail e 
where exists (select 1 from Sent_Emails where userEmailID=e.ID and 

TRUNC(emailDate)=TRUNC(sysdate)) 

heute nicht gesendet:

select * from UsersEmail e 
    where not exists (select 1 from Sent_Emails where userEmailID=e.ID and 

    TRUNC(emailDate)=TRUNC(sysdate)) 
+0

die 'exists-Klausel' ist viel ineffizienter als die Verwendung eines Joins – gh9

+0

Nonsense. Die einzige Möglichkeit, dies sicher zu wissen, ist der Abfrageplan. Häufig sind die Abfragepläne identisch. In der Vergangenheit war 'Existieren' oft _mehr_effizient (wenn Sie nur auf den Clustered-Index verwiesen haben), aber wenn Abfrageplaner intelligenter werden, sind die beiden Ansätze im Allgemeinen gleich. –

0

gesendete E-Mails heute

SELECT * FROM UserEmail as E 
INNER JOIN sentEmails AS s ON s.userEmailID = e.UserEmailId 
WHERE s.date = YOUR_TARGET_DATE 

E-Mails nicht gesendet heute

SELECT * FROM UserEmail as E 
INNER JOIN sentEmails AS s ON s.userEmailID = e.UserEmailId 
WHERE s.date <> YOUR_TARGET_DATE 
+0

Ihr zweites SQL wird alles zurückgeben, was gestern, letzte Woche und letztes Jahr gesendet wurde, auch wenn es heute gesendet wurde. – JBrooks

+0

@jbrooks, das hängt von seiner Datumsspalte ab, die nicht angegeben wurde. Wenn es ein Datum "2012-01-01" ist, dann wird es nicht. Pro OP-Anfrage OP benötigt nur eine Abfrage, die Dinge für heute nicht zurückgibt. Wenn OP sagt, dass die Datumsspalte eine Datetime ist, dann muss sich meine Abfrage ändern, aber ohne weitere Informationen, die nicht notwendig sind – gh9

0

Sie möchten tatsächlich die gesendeten E-Mails verfolgen und können nicht gesendet werden? Wenn ich Sie wäre, würde ich eine Spalte auf meinem Tisch „Sent_Emails“ Datumzeit hinzufügen, und Datum senden, wenn ich von einem Benutzer gesendete E-Mail wird, und in diesem Fall

--MAILS SENT: SELECT * FROM SEND_MAILS WITH (NOLOCK) INNER JOIN USEREMAILS MIT (NOLOCK) ON SEND_MAILS.USERMAILID = USEREMAILS.USERMAILID WHERE SEND_MAILS.SENDDATE IS NOT NULL

--MAILS NICHT - SENT: SELECT * FROM SEND_MAILS WITH (NOLOCK) INNER JOIN USEREMAILS MIT (NOLOCK) ON SEND_MAILS.USERMAILID = USEREMAILS.USERMAILID WHERE SEND_MAILS.SENDDATE IST NULL

Und mit dieser Info können Sie täglich versendete Mails melden. wie

SELECT * FROM SEND_MAILS WITH (NOLOCK) INNER JOIN USEREMAILS MIT (NOLOCK) ON = SEND_MAILS.USERMAILID USEREMAILS.USERMAILID WHERE SEND_MAILS.SENDDATE = '2016.05.24'

0

Ich wiederhole das Problem gerne auf Englisch und schreibe dann das SQL. Sie möchten die letzte E-Mail, die für eine gegebene userEmailID gesendet wurde, mit dem heutigen Beginn vergleichen. Die folgende Unterabfrage enthält die letzte E-Mail, die für eine angegebene userEmailID gesendet wurde.Die case-Anweisung wird 1 für heute gesendet und 0 für nie gesendet oder letzte E-Mail früher als heute gesendet.

SELECT E.*, 
CASE WHEN MaxSentEmail > trunc_date(getdate()) THEN 1 ELSE 0 END AS SentToday 
FROM UserEmail as E 
LEFT JOIN (SELECT se.userEmailID, 
    max(se.sentEmails) AS MaxSentEmail 
    FROM sentEmails se 
    GROUP BY se.userEmailID) as se 
on E.UserEmailID = se.userEmailID 
ORDER BY E.UserEmailID