1

我有 3 张桌子正在使用。

TableA, TableB, TableC

TableA 包含客户的信息,每一行包含一个特定人员的所有信息。

TableB 包含 TableA 中的人创建的消息的信息。

ID  DistID  Subject Message CreatedDate StatusID    SentTotal
57  3   MonList MonList 2012-03-19 16:21:36.117 2   4

表 C 包含有权访问表 B 中消息的人员的列表。

ID     MessageID    DistID  StatusID  Important  OriginalMessagelID
25111   58            516       1          0       NULL
25112   58            519       1          0       NULL
25114   58            374       1          0       NULL
25115   58            5545      1          0       NULL
25116   58            23435     1          0       NULL

TableC MessageID 将与 TableB ID 相同。

TableB 和 TableC 的 DistID 将引用 TableA 中的 DistID(表 A 包括复制很多信息的方式,即使是单行,它也是 1 比 1 的比例,一个客户需要 1 行)。

我需要生成一个将这三个表链接在一起的查询。这是我到目前为止所拥有的:

SELECT *
FROM Distributor d
INNER JOIN Messages ms
    ON ms.DistID = d.DistID
INNER JOIN Message m
    ON m.DistID = d.DistID
WHERE ((d.DCLoginDate <= (GETDATE() - 3) OR d.DCLoginDate IS NULL) AND (CONVERT(VARCHAR(8), m.CreatedDate, 1)) = (CONVERT(VARCHAR(8), GETDATE(), 1)))

现在 TableB 可以有同一个客户创建的多条消息,因此他们的 DistID 可以在此表中出现超过 1 次。

TableC 也是这样,DistID 可以在这个表中出现多次。

我开始进行有效的个别查询:

SELECT *
FROM Distributor
WHERE (DCLoginDate <= (GETDATE() - 3) OR DCLoginDate IS NULL)

SELECT *
FROM Message m
INNER JOIN Messages ms
    ON ms.MessageID = m.ID
WHERE ((CONVERT(VARCHAR(8), CreatedDate, 1)) = (CONVERT(VARCHAR(8), GETDATE(), 1)))

以上工作正常,当我尝试将它们组合成一个语句时,它开始返回 0 结果,而我应该返回两个结果(来自我的实时数据,而不是上面提供的数据)。

任何人都知道如何让它有效地工作?

4

1 回答 1

2

您的连接条件在单个查询和单个查询之间是不同的……这又如何呢?

SELECT *
FROM Distributor d
INNER JOIN Messages ms
   ON ms.DistID = d.DistID
INNER JOIN Message m
   ON m.ID = ms.MessageID
WHERE 
   ((d.DCLoginDate <= (GETDATE() - 3) OR d.DCLoginDate IS NULL) AND 
   (CONVERT(VARCHAR(8), m.CreatedDate, 1)) = (CONVERT(VARCHAR(8), GETDATE(), 1)))
于 2012-04-05T20:52:38.013 回答