Получить значения из всех подразделенных дочерних таблиц - PullRequest
1 голос
/ 05 августа 2010

У меня есть три таблицы, как показано ниже.

TransactionTable
----------------
TransactionID
Status
Value
FileNo      (int)
FileType        - 'E' indicates Email,  'D' Indicates Document


EmailTable
----------
EmailFileNo (Identity)
ReceivedDate
....
....
....



DocumentsTable
---------------
DocFileNo   (Identity)
ReceivedDate
.....
.....

Между EmailTable и TransactionTable, а также между DocumentsTable и TransactionTable

существует отношение один ко многим * Что такоеимя для такого типа отношений ... Я только что использовал термин подразделяемые дочерние таблицы

Мне нужно выбрать TransactionID, ReceivedDate, Значение, где статус 'P' ...

Я мог бы получить результат, используя

Select A.TransactionID, IsNull(B.ReceivedDate, C.ReceivedDate)  as ReceivedDate, A.Value
    From TransactionTable as A 
        Left outer join EmailTable as B on A.FileNo = B.EmailFileNo and A.FileType='E'
        Left outer join DocumentsTable as C on A.FileNo = C.DocFileNo and A.FileType = 'D'
                   where A.Status = 'P' 

Приведенный выше запрос дает мне ожидаемый результат ... Это так, как это должно быть, или есть лучший способобрабатывать такие сценарии?

Редактировать: Включено предложение where, пропущенное при операции копирования-вставки.Спасибо за указание на это.

Ответы [ 2 ]

0 голосов
/ 05 августа 2010

Ваш запрос выглядит хорошо.Единственный комментарий, который я хотел бы сделать, это то, что я не вижу, чтобы вы удовлетворяли условию Status = 'P', которое вы указали в своих требованиях.

Select A.TransactionID, IsNull(B.ReceivedDate, C.ReceivedDate)  as ReceivedDate, A.Value
    From TransactionTable as A 
        Left outer join EmailTable as B 
            on A.FileNo = B.EmailFileNo 
                and A.FileType='E'
        Left outer join DocumentsTable as C 
            on A.FileNo = C.DocFileNo 
                and A.FileType = 'D'
    where A.Status = 'P'
0 голосов
/ 05 августа 2010

Кто-то может иметь лучший ответ, но это почти так.Вы можете выбрать COALESCE вместо ISNULL, который допускает переменное количество аргументов, поэтому вы можете добавить третий вариант, если оба адреса электронной почты и документы по какой-то причине равны NULL.

Все, что следует, простоКомментарий к схеме.У структуры таблицы есть проблема, но я уверен, что вы сейчас пишете код после того, как эти таблицы уже созданы, так что это не обязательно призыв к действию.Вам, вероятно, придется жить с ними такими, какие они есть.

Мой инстинктивный ответ состоял бы в том, чтобы назначить TransactionId дочерним таблицам, потому что они формально не являются сейчас дочерними.Это автономные объекты, на которые ссылается TransactionTable.

Раньше у меня была похожая проблема, когда у меня был ключевой столбец, у которого не было четкого определения, и я в итоге выбрал его.Невозможно создать формальное ограничение / внешний ключ для FileNo в TransactionTable, поскольку FileNo может быть определен для любой из двух таблиц.

(Кстати, ваша проверка status = 'P' отсутствует в вашем запросе.)

Также, если вы продолжите добавлять новый тип файла после 'E' и 'D', вам придется продолжать расширять запрос на новые таблицы.Таблица файлов некоторой формы с ключевыми полями могла бы быть одним из способов решения этой проблемы.[насколько я знаю, у вас, возможно, уже есть какая-то таблица файлов]

Хотя я не уверен, что вам это поможет.Нет способа улучшить ваш запрос без изменения структуры таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...