2016-05-06 2 views
0

からすべての個々の項目を返します。SQL:テーブルはリストに個々の項目やFKが含まれています - 私は、組み合わせ表を持っているテーブル&リスト

  • 条件の自動メールのUIアクションを持つテーブルへの自動電子メール(FK用

    :トリガー)電子メールでのテーブルに、個々のユーザーのための
  • メール(FK)
  • メーリングリスト(FKメーリングリストを持つテーブルへ)

このテーブルには、私を可能に

  • 自動メールに個別の電子メールを追加しますが
  • をトリガー
  • メーリングリストに個々の電子メールを追加し、自動メールにメーリングリストを追加
    • メーリングリストだけで、個々の電子メールを持っているトリガ - メーリングリストは入れ子にすることはできません

私は、ウェブサイトからの電子メールを送信する必要がある場合、私はすべての異なる電子メールをプルする必要があります目的の自動電子メールトリガーのために。私は個々の電子メールをのみします。トリガーに割り当てられているすべての/メーリングリストについて、メーリングリストの名前ではなく、そのメーリングリストのメールを返送したいと思います。

EDIT(更新テーブル):

実際のDBテーブル:

ユーザテーブル

User_ID First_Name Last_Name Email  Other Info (multiple columns) 
---------------------------------------------------------------------------- 
1   Mike   Smith  [email protected] <other info> 
2   Sue   Jones  [email protected] <other info> 
3   Bob   Roberts  [email protected] <other info> 
4   Mary   Evans  [email protected] <other info> 
5   Joe   Miller  [email protected] <other info> 

Auto_Emailテーブル

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テーブル

(個々の電子メール、チームAの電子メール、およびチームBの電子メールから):Auto_Email条件 "の保存・イベント" のための210

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   [email protected] 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   [email protected] NULL  NULL 
5 2    Confirm Friend NULL  NULL   3   Team C 
6 NULL   NULL   1   [email protected] 1   Team A 
7 NULL   NULL   3   [email protected] 1   Team A 
8 NULL   NULL   4   [email protected] 2   Team B 
9 NULL   NULL   5   [email protected] 3   Team C 

望ましい結果

[email protected] 
[email protected] 
[email protected] 

私は以下のコードでこれを行う方法を知っていますが、それは多くのループとSQLコールバックです。私は単一のSQL proc/queryでこれを行うことを好むだろうが、私は方法を知らない。

vbを使用しています。ネット:

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() 
+1

私はあなたが何を求めているのかは分かりませんが、これはひどいデータベース設計として私を襲っています。 –

+0

これは非常に畳み込まれたテーブルです...いくつかの異なるテーブルの列を表示していますか、それとも実際に*どのように格納されていますか? (あなたの質問に表示されている方法とは異なる方法でテーブル構造を表示してください。) – Siyual

+0

DBビューに表示されているカラムを表示していました。関連するすべてのテーブルの構造を追加しました。 – steelerose

答えて

0

次の仕事をするようだ:

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

  • User_List一致するユーザーやリスト、および
  • :シンプルなSQL /読みやすく(そしておそらく若干良いパフォーマンス)のために

    Email_Listテーブルは、おそらくより良い2つのまたは3つのテーブルに分割されるだろう

  • ユーザーとリストの1つ(それぞれ)は、Auto_Emailに揃えられます。

調整が必要な場合はコメントしてください。

+0

@steeleroseこれはあなたが探していた場所に近いところに行っているかどうかを確認するチャンスがありましたか? – Abecee

関連する問題