2012-04-05 7 views
1

У меня есть 3 таблицы, с которыми я работаю.Сложный SQL-запрос, возвращающий нежелательные результаты

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 

В таблицеС содержится список людей, имеющих доступ к сообщению в 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.

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

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

ответ

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))) 
+0

Спасибо, что работали так, как будто предполагалось вернуть 2 результата. Иногда самые трудные вещи - самые простые. Работало. –

+0

@JamesWilson Добро пожаловать, рад, что помог! –

Смежные вопросы