Сложный 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)))