Вопрос:SQL: Когда и почему разрешены два условия?
У меня недавно возникла интересная проблема SQL.
Мне пришлось заключить договор аренды лизингового объекта.
Проблема заключалась в том, что в комнате может быть несколько договоров аренды, а также несколько предметов лизинга в каждой комнате.
Однако из-за плохой дробной работы в помещение, а не объект лизинга, передаются лизинговые контракты. Поэтому мне пришлось принять номер контракта и сравнить его с номером объекта лизинга, чтобы получить правильные результаты.
Я думал, что это будет делать:
SELECT *
FROM T_Room
LEFT JOIN T_MAP_Room_LeasingObject
ON MAP_RMLOBJ_RM_UID = T_Room.RM_UID
LEFT JON T_LeasingObject
ON LOBJ_UID = MAP_RMLOBJ_LOBJ_UID
LEFT JOIN T_MAP_Room_LeasingContract
ON T_MAP_Room_LeasingContract.MAP_RMCTR_RM_UID = T_Room.RM_UID
LEFT JOIN T_Contracts
ON T_Contracts.CTR_UID = T_MAP_Room_LeasingContract.MAP_RMCTR_CTR_UID
AND T_Contracts.CTR_No LIKE (ISNULL(T_LeasingObject.LOBJ_No, '') + '.%' )
WHERE ...
Однако, поскольку таблица отображения получает присоединилась прежде, чем у меня есть номер контракта, и я не могу получить номер договора без таблицы отображения, я удвоился запись.
Проблема немного сложнее, поскольку номера, не имеющие договора аренды, также должны появляться, поэтому я не мог просто использовать внутреннее соединение.
С немного поэкспериментировать, я обнаружил, что это работает, как ожидалось:
SELECT *
FROM T_Room
LEFT JOIN T_MAP_Room_LeasingObject
ON MAP_RMLOBJ_RM_UID = T_Room.RM_UID
LEFT JON T_LeasingObject
ON LOBJ_UID = MAP_RMLOBJ_LOBJ_UID
LEFT JOIN T_MAP_Room_LeasingContract
LEFT JOIN T_Contracts
ON T_Contracts.CTR_UID = T_MAP_Room_LeasingContract.MAP_RMCTR_CTR_UID
ON T_MAP_Room_LeasingContract.MAP_RMCTR_RM_UID = T_Room.RM_UID
AND T_Contracts.CTR_No LIKE (ISNULL(T_LeasingObject.LOBJ_No, '') + '.%' )
WHERE ...
теперь я понимаю, почему два условий в одном соединения, которые, как правило, любезно конструктор запросов, может быть полезным, и какая разница.
Мне было интересно, является ли это специфической вещью MS-SQL/T-SQL, или это стандартный sql.
Так что я попытался в PostgreSQL с еще тремя таблицами.
Так что я написал этот запрос на 3 других таблиц:
SELECT *
FROM t_dms_navigation
LEFT JOIN t_dms_document
ON NAV_DOC_UID = DOC_UID
LEFT JOIN t_dms_project
ON PJ_UID = NAV_PJ_UID
и попытался превратить его в один с двумя на условиях
SELECT *
FROM t_dms_navigation
LEFT JOIN t_dms_document
LEFT JOIN t_dms_project
ON PJ_UID = NAV_PJ_UID
ON NAV_DOC_UID = DOC_UID
Так что я подумал, что это T-SQL специфична, но быстро в MS-SQL тоже, просто чтобы с удивлением обнаружить, что он тоже не работает.
Я думал, что это может быть из-за отсутствия внешних ключей, поэтому я удалил их на всех таблицах в запросе моей комнаты, но это все еще не сработало.
Так вот мой вопрос:
Почему 2 на условиях даже законных, имеет ли это имя и почему он не работает на моем втором примере?
«не работает» - вы получаете сообщения об ошибках? Они могут быть весьма информативными. –
Сообщение об ошибке: Недопустимое имя объекта 't_dms_document'. Но имя правильно (правый каталог db также), если я выберу * из t_dms_document, я получаю результаты. –