Сложный SQL-запрос, возвращающий нежелательные результаты

У меня 3 таблицы, с которыми я работаю.

TableA, TableB, TableC 

Таблица A содержит информацию для клиента, каждая строка содержит всю информацию для одного конкретного человека.

Таблица Б содержит информацию для сообщения, созданного человеком в 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 будет таким же, как ID TableB.

TableB и TableC DistID будут ссылаться на DistID в таблице A (таблица 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 результатов, когда я должен был вернуть два (из моих живых данных, а не из приведенных выше данных).

Кто-нибудь понимает, как заставить это работать эффективно?

Ваши условия соединения были разными между одним запросом и отдельными запросами … Как насчет этого?

 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))) 
Давайте будем гением компьютера.