3

我在做什么:

我正在编写一个 C# 应用程序,它将帮助员工处理电子邮件。我有一个带有邮件的数据库(SQL Server 2008 Express)。一个表包含邮件本身(每一行都有类似的列msgId, sender, recipients, subject, body),另一个表包含员工如何处理邮件的数据 - 每当电子邮件分配了某些属性时,具有该属性的新行将保存到第二个表.

第二个表包含列:msgId, forTeam, notForTeam, processedByTeam。每当员工将消息标记为与其团队相关时,都会在列中保存一行并带有TEAMXXforTeam。每当员工对电子邮件执行其他操作时,都会在列中保存一行具有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 处理 - 现在应该在“This Team's”中对 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 回答