繁体   English   中英

SQL:表格包含单个项目,并在列表中添加FK-返回表格和列表中的所有单个项目

[英]SQL: table contains individual items and FK to lists - return all individual items from table & lists

我有一张桌子,上面有:

  • 自动电子邮件的条件(带有自动电子邮件UI操作触发器的FK到表格)
  • 单个用户的电子邮件(FK与电子邮件一起显示)
  • 邮件列表(FK到带有邮件列表的表)

该表使我能够:

  • 将单个电子邮件添加到自动电子邮件触发器
  • 将单个电子邮件添加到邮件列表
  • 将邮件列表添加到自动电子邮件触发器
    • 邮件列表仅包含个别电子邮件-邮件列表不能嵌套

当我需要从网站发送电子邮件时,我需要提取所有不同的电子邮件以获取所需的自动电子邮件触发器。 需要个人电子邮件。 对于分配给触发器的任何/所有邮件列表,我想返回该邮件列表的电子邮件,而不是邮件列表的名称。

编辑(更新表):

实际的数据库表:

用户表

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表可能最好分成两个或三个表:

  • 与用户和列表匹配的User_List ,以及
  • 一个(每个)供用户使用,并且列表与Auto_Email对齐。

请评论,如果并且因为这需要调整/进一步的细节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM