3

私がしていること:

従業員が電子メールを処理するのに役立つC#アプリケーションを作成しています。メールを含むデータベース(SQL Server 2008 Express)があります。1つのテーブルにはメール自体が含まれ(各行にはmsgId, sender, recipients, subject, bodyなどの列があります)、もう1つのテーブルには従業員によるメールの処理方法のデータが含まれます-メールにプロパティが割り当てられると、プロパティを持つ新しい行が2番目のテーブルに保存されます。

2番目のテーブルには列が含まれています:msgId, forTeam, notForTeam, processedByTeam。従業員がメッセージを自分のチームに関連するものとしてマークするたびに、行は列にTEAMXX値とともに保存されforTeamます。従業員が電子メールに対して他のアクションを実行するたびに、TEAMXX値のある行が列に保存されprocessedByTeamます。

「未処理」ビューにメールを表示しようとしています。次の値を持つメール:

forTeam: null
notForTeam: everything different than 'TEAM01'
processedByTeam: everything different than 'TEAM01'

私はさまざまなクエリを作成しようとしていますが、それでも希望どおりに機能せず、気が狂います。正しいクエリに感謝します。

例:

メールのあるテーブル(Mails):

msgId sender  subject body  received (sortingTime)
53    x@x.com test    test  2012-05-11 11:00
54    b@b.com test2   test2 2012-05-10 10:00
55    h@h.com blah    blah  2012-05-11 12:00
56    t@t.com dfgg    dfgg  2012-05-11 12:30

割り当てのあるテーブル(MailAssignments):

msgId forTeam notForTeam  processedByTeam
54    null    TEAM02      null            - this means TEAM02 hid the mail from their view
54    TEAM01  null        null            - this means TEAM01 assigned the mail to them
54    null    null        TEAM01          - TEAM01 has processed the mail

53    TEAM01  null        null            - invisible to other teams
53    null    TEAM01      null            - invisible for TEAM01 (and also for others because of the above)

56    TEAM01  null        null
56    null    null        TEAM01          - mail processed by TEAM01

ここで、C#アプリに、メールを「未処理」として表示するビューを持たせたいと思います。

  1. メール54はTEAM02のために最初に隠されました-彼らには見えないはずです
  2. メール54がTEAM01に割り当てられました-「このチームの」ビューに表示されるはずです
  3. メール54はTEAM01によって処理されました-「このチームの」ビューでは表示されないはずです
  4. メール53はTEAM01に割り当てられました-「このチームの」ビューに表示されるはずです(そして彼らだけに)
  5. メール53はTEAM01のために隠されていました-TEAM01には見えないはずです(そして前のアクションのために他の人には見えないはずです)
  6. メール56がTEAM01に割り当てられました-「このチーム」のTEAM01にのみ表示されるようになりました
  7. メール56はTEAM01によって処理されました-「このチーム」のTEAM01では非表示になります

したがって、両方のテーブルに現在のデータがある場合、最終的に、TEAM01は「未処理」ビューでのみ表示されます。

mail 55
4

1 に答える 1

2
DECLARE @teamName varchar(50) = 'TEAM01'

SELECT * 
FROM Mails M
LEFT OUTER JOIN MailAssignments MA ON M.msgId = MA.msgId
WHERE MA.msgId IS NULL OR 
      (
         MA.forTeam IS NULL AND 
         MA.notForTeam <> @teamName AND 
         MA.processedByTeam <> @teamName
      )

これはあなたが望むことをしますか?

于 2012-05-16T07:06:11.720 に答える