[英]SQL: table contains individual items and FK to lists - return all individual items from table & lists
我有一张桌子,上面有:
该表使我能够:
当我需要从网站发送电子邮件时,我需要提取所有不同的电子邮件以获取所需的自动电子邮件触发器。 我只需要个人电子邮件。 对于分配给触发器的任何/所有邮件列表,我想返回该邮件列表的电子邮件,而不是邮件列表的名称。
编辑(更新表):
实际的数据库表:
用户表
User_ID First_Name Last_Name Email Other Info (multiple columns)
----------------------------------------------------------------------------
1 Mike Smith mike@me.com <other info>
2 Sue Jones sue@me.com <other info>
3 Bob Roberts bob@me.com <other info>
4 Mary Evans mary@me.com <other info>
5 Joe Miller joe@me.com <other info>
自动电子邮件表
Auto_Email_ID Page Trigger
----------------------------------------------------------------------------
1 Events Save Event
2 Events Edit Event
3 Events Delete Event
4 Friends Request Friend
5 Friends Confirm Friend
Mailing_List表
Mailing_List_ID Mailing_List
----------------------------------------------------------------------------
1 Team A
2 Team B
3 Team C
Email_List表
ID Auto_Email_ID User_ID List_ID
----------------------------------------------------------------------------
1 1 1 NULL
2 1 NULL 1
3 1 NULL 2
4 2 2 NULL
5 2 NULL 3
6 NULL 1 1
7 NULL 3 1
8 NULL 4 2
9 NULL 5 3
Email_List视图
ID Auto_Email_ID Trigger User_ID Email List_ID List
----------------------------------------------------------------------------
1 1 Save Event 1 mike@me.com NULL NULL
2 1 Save Event NULL NULL 1 Team A
3 1 Save Event NULL NULL 2 Team B
4 2 Confirm Friend 2 sue@me.com NULL NULL
5 2 Confirm Friend NULL NULL 3 Team C
6 NULL NULL 1 mike@me.com 1 Team A
7 NULL NULL 3 bob@me.com 1 Team A
8 NULL NULL 4 mary@me.com 2 Team B
9 NULL NULL 5 joe@me.com 3 Team C
Auto_Email条件“保存事件”的所需结果:(来自各个电子邮件,A组电子邮件和B组电子邮件):
mike@me.com
bob@me.com
mary@me.com
我知道如何使用下面的代码来执行此操作,但是有很多循环,并且需要回调用SQL。 我宁愿使用单个SQL proc /查询来执行此操作,但我不知道如何做。
使用vb.Net:
Dim sendTo = New List(Of String)
For Each email As MyObject In GetEmailsForAutoEmail("Save Event") 'calls SQL proc
If (email.Email_ID.HasValue) Then
sendTo.Add(email.Email)
Else
For Each mlEmail As MyObject In GetEmailsForMailingList(email.List) 'calls SQL proc
sendTo.Add(mlEmail.Email)
Next
End If
Next
sendTo = sendTo.Distinct()
似乎可以完成以下任务:
SELECT
email
FROM Usr U
JOIN Email_List E
ON U.user_ID = E.user_ID
AND E.list_ID IS NULL
JOIN Auto_Email A
ON E.auto_Email_ID = A.auto_Email_ID
AND A.triggr = 'Save Event'
UNION
SELECT
email
FROM Usr U
JOIN Email_List E1
ON U.user_ID = E1.user_ID
AND E1.auto_Email_ID IS NULL
JOIN Email_List E2
ON E1.list_ID = E2.list_ID
AND E1.auto_Email_ID IS NULL
AND E2.user_ID IS NULL
JOIN Mailing_List M
ON E2.list_ID = M.mailing_List_ID
AND E2.user_ID IS NULL
JOIN Auto_Email A
ON E2.auto_Email_ID = A.auto_Email_ID
AND E2.user_ID IS NULL
AND A.triggr = 'Save Event'
;
它将个别列出的用户与用户UNION
一起通过某些列表进行注册。
实际操作中可以看到它: SQL Fiddle 。
为了更简单的SQL /更好的可读性(可能还有更好的性能), Email_List表可能最好分成两个或三个表:
请评论,如果并且因为这需要调整/进一步的细节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.