Я не несу ответственности за этот дизайн, но мне нужно извлечь данные из этой схемы, которые выглядят примерно так (SQL Server 2000):
CREATE TABLE contract
(
contract_id int,
account_id int, /* account table */
responsible_id int, /* account table */
holding_id int, /* account table */
billingaddress_id int, /* address table */
deliveryaddress_id int, /* address table */
)
CREATE TABLE address
(
address_id int,
postalcode char(4),
)
CREATE TABLE account
(
account_id int,
firstname varchar(40),
billingaddress_id int, /* address table */
deliveryaddress_id int, /* address table */
)
account_id, liability_id и holding_id в таблице контрактов могут иметь значение null, совместно использовать значения или иметь разные значения. Он может иметь или не иметь адрес выставления счета и / или доставки.
Субъект счета всегда имеет платежный адрес доставки или , и оба могут быть одинаковыми.
Мне нужно найти все учетные записи, связанные с договорами (т. Е. Договор имеет тот же счет, ответственный или владеющий идентификатором, что и идентификатор учетной записи), и связаны с адресами, имеющими определенный почтовый индекс (либо напрямую, либо через контракт).
Проблема, кажется, в 2 раза:
а) Получение счетов, связанных с контрактами
б) Фильтрация результатов из (а) для получения учетных записей, связанных с определенным почтовым индексом
Это не работает, потому что если account_id не связан с рассматриваемым почтовым индексом, а holding_id, то он не будет возвращен:
FROM account
INNER JOIN contract
ON account.account_id =
CASE WHEN NOT IsNull(contract.account_id) THEN contract.account_id
WHEN NOT IsNull(contract.responsible_id) THEN contract.responsible_id
ELSE contract.holding_id END
По какой-то причине это происходит слишком медленно (FK не индексируются - ждут 30 минут и не возвращаются):
FROM account
INNER JOIN contract
ON account.account_id = contract.account_id
OR account.account_id = contract.responsible_id
OR account.account_id = contract.holding_id
Единственное, что, похоже, сработало, это UNION, но у меня все еще остается проблема фильтрации результатов по типу адреса.
Какой самый короткий способ вернуть требуемые результаты? В данный момент я склоняюсь к созданию временной таблицы для хранения промежуточных данных.