У меня есть база данных Access 2007, где у меня есть две таблицы, exp_cash и exp_cheque. Оба связаны с exp_cat, где exp_cat содержит список категорий, и exp_cash и exp_cheque содержат идентификатор, cat_id, exp_date, exp_amount, и exp_note.
Когда я пытался объединить их, ничто не появляется в результате, если я не удаляю cat_name из своего запроса. Я использовал простой запрос:
SELECT DISTINCT
exp_cat.cat_name,
exp_cash.exp_amount,
exp_cheque.exp_amount
FROM (exp_cat INNER JOIN exp_cash
ON exp_cat.ID = exp_cash.exp_cat_id)
INNER JOIN exp_cheque
ON exp_cat.ID = exp_cheque.exp_cat_id;
Таблица exp_cat содержит
exp_cat_name
exp_cat_id
exp_cat_id ----- exp_cat_name
1 ----- Salary
2 ----- Electricity
3 ----- Water Bill
4 ----- Loan
Таблица exp_cash содержит
exp_cash_id
exp_date
exp_cat_id
exp_cash_amount
exp_invoice_no
exp_cash_id ----- exp_date ---- exp_cat_id ---- exp_cash_amount ---- exp_invoice_no
1 ----- 15/05/2010 -- 2 ---- 200 ---- 25AB5245
2 ----- 17/05/2010 -- 1 ---- 50 ---- 58624AA
Таблица exp_cheue содержит
exp_cheque_id
exp_date
exp_cat_id
exp_cheque_amount
exp_invoice_no
exp_cheque_id ----- exp_date ---- exp_cat_id -- exp_cheque_amount -- exp_invoice_no
1 ----- 15/05/2010 -- 3 -- 120 -- 25AB5245
2 ----- 17/05/2010 -- 4 -- 500 -- 58624AA
Я думаю, что вам нужны левые соединения вместо внутренних:
SELECT exp_cat.exp_cat_name,
exp_cheque.exp_cash_amount,
exp_cash.exp_cheque_amount
FROM (exp_cat LEFT JOIN exp_cash
ON exp_cat.exp_cat_id = exp_cash.exp_cat_id)
LEFT JOIN exp_cheque
ON exp_cat.exp_cat_id = exp_cheque.exp_cat_id;
В противном случае у вас должен быть один и тот же exp_cat_id в таблицах exp_cash и exp_cheque. Внутренние соединения показывают только то, что существует в обеих таблицах. Левое соединение показывает все, что находится в левой таблице, и все, что встречается в правой таблице (или нулевые значения, если ничего не совпадает).
Вот что я получаю, когда запускаю этот запрос с вашими данными:
exp_cat_name exp_cash_amount exp_cheque_amount
------------ --------------- -----------------
Salary 50
Electricity 200
Water Bill 120
Loan 500
Я настоятельно рекомендую вам подумать о реализации обобщения в вашей модели базы данных. Это позволит вам объединить таблицы exp_cash и exp_cheque. Например, вы можете добавить поле, такое как «exp_type», в таблицу «exp». Добавив еще одно поле для отслеживания, если операция является либо расходом, либо доходом, вы могли бы даже получить более общую таблицу, которую мы могли бы назвать «ope» (это означает «операции с расходами и доходами») со следующими полями:
Таким образом, вы сможете рассчитывать остатки (по типу, периоду и т. д.), не превращая это в кошмар!
немного теории по обобщению баз данных здесь