复杂SQL查询返回不需要的结果

时间:2012-04-05 20:46:55

标签: sql-server tsql

我正在使用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

TableC包含有权访问TableB中的消息的人员列表。

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可以在这个表中出现超过一次。

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结果,当我应该返回两个(从我的实时数据,而不是上面提供的数据)。

任何人都明白如何有效地工作?

1 个答案:

答案 0 :(得分: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)))