У меня есть 3 таблицы в MySQL (5.1):
account, bank_account_data и investment_account_data.
таблицы определены следующим образом:
(ПРИМЕЧАНИЕ: это упрощенная версия, в реальных таблицах больше столбцов, а в банковских и инвестиционных данных содержится разная информация, которая не нужна для этого конкретного случая, но нужна в другом месте)
CREATE TABLE account
(
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
type ENUM ('INVESTMENT', 'BANK') NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE investment_account_data
(
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
account_id BIGINT UNSIGNED NOT NULL,
as_of_date TIMESTAMP NULL DEFAULT NULL,
total_balance NUMERIC(12, 4) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (account_id) REFERENCES account (id),
CONSTRAINT unique_per_account_and_date UNIQUE (account_id, as_of_date)
) ENGINE=InnoDB;
CREATE TABLE bank_account_data
(
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
account_id BIGINT UNSIGNED NOT NULL,
as_of_date TIMESTAMP NULL DEFAULT NULL,
current_balance NUMERIC(12, 4) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (account_id) REFERENCES account (id),
CONSTRAINT unique_per_account_and_date UNIQUE (account_id, as_of_date)
) ENGINE=InnoDB;
В настоящее время у меня есть только одна учетная запись в таблице счетов с id = 1 и типом = 'INVESTMENT'.
и у меня есть одна запись в таблице investment_account_data (id = 1, account_id = 1, total_balace = 15000, as_of_data = '2011-03-02 00:00:00')
В bank_account_data нет строк.
Выполнение следующего запроса (на удивление) не возвращает строк:
SELECT A.id as account_id,
COALESCE(BD.as_of_date, ID.as_of_date) as as_of_date,
COALESCE(BD.current_balance, ID.total_balance) as balance
FROM account A
LEFT JOIN bank_account_data BD ON (BD.account_id = A.id and A.type='BANK')
LEFT JOIN investment_account_data ID ON (ID.account_id = A.id and A.type='INVESTMENT')
WHERE A.id=1
но этот возвращает одну строку (как и ожидалось):
SELECT A.id as account_id,
COALESCE(BD.as_of_date, ID.as_of_date) as as_of_date,
COALESCE(BD.current_balance, ID.total_balance) as balance
FROM account A
LEFT JOIN investment_account_data ID ON (ID.account_id = A.id and A.type='INVESTMENT')
LEFT JOIN bank_account_data BD ON (BD.account_id = A.id and A.type='BANK')
WHERE A.id=1
Есть идеи, почему я вижу эти результаты?
Также, если я удалю условие A.type из объединения, оно также вернет одну строку.