2012-05-24 3 views
1

Я нахожусь в задаче соединения трех таблиц: Задача, блок и здание.SQL присоединиться к 2 таблицам к 1 таблице

В таблице задач есть столбец для единицы и столбец для здания.
Любая отдельная задача присваивается только зданию ИЛИ блоку, ни тем, ни другим. Таким образом, каждый столбец в каждой записи всегда равен нулю. В таблице задач есть 6100 записей.

, когда я использую этот JOIN:

select * from task t 
join building b on b.id = t.building_id; 

Я получаю 628 строк. Это правильный итог строительных задач.

Когда я использую этот РЕГИСТРИРУЙТЕСЬ

select * from active_task at 
inner join unit_template ut on ut.id = at.unit_template_id 

Я получаю 5472 строк. Это правильное количество заданий на единицу. Если я добавлю их 5472 + 628 = 6100, это будет правильное количество строк в таблице задач.

Когда я запускаю этот запрос:

select * from task t 
inner join unit ut on ut.id = t.unit_id 
inner join building bt on bt.id = t.building_id 

Я получаю ноль строк. Мне нужен мой запрос для извлечения 6100 строк. Любая помощь будет оценена по достоинству.

basic ER

+0

Что делать, если вы пишете запрос итеративно? Просто добавьте сначала 'JOIN' и убедитесь, что вы получите ожидаемые результаты. ** ТОЛЬКО ** после этого добавить другое соединение – zerkms

+0

Или использовать, где часть –

+0

@denonth: по какой причине? Оптимизатор переписывает 'INNER JOIN + ON' на неявное соединение с' WHERE' перед исполнением – zerkms

ответ

1

Попробуйте налево присоединиться:

select * from task t 
left join unit ut on ut.id = t.unit_id 
left join building bt on bt.id = t.building_id 
2
SELECT * 
FROM task t 
LEFT JOIN 
     unit ut 
ON  ut.id = t.unit_id 
LEFT JOIN 
     building bt 
ON  bt.id = t.building_id 
     AND t.unit_id IS NULL 
1

Если вы хотите, чтобы все матчи, данные обоих запросов, почему не объединительных:

SELECT * from task t JOIN building b ON b.id = t.building_id 
UNION 
SELECT * from active_task at JOIN unit_template ut ON ut.id = at.unit_template_id 

Пока два таблицы задач имеют одинаковое количество полей, которые должны быть достаточными (в противном случае фильтровать нужные столбцы в выбранном статусе ements).

+0

Это интересно. Спасибо. – GRY

Смежные вопросы