SQL - Объединение таблиц с одинаковой структурой

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

SQL - Объединение таблиц с одинаковой структурой

Сообщение VVitafresh » 06.10.2005 (Чт) 19:11

Есть несколько таблиц (напр., T1, T2, T3) с одинаковой структурой (ID, F1, F2, ...). Ключевое поле ID уникально, но количество записей в таблицах различно. Как объединить таблицы, чтобы получить новую со структурой:
ID, T1.F1, T2.F1, T3.F1, T1.F2, ...
При этом мне требуется выводить записи, если хотя бы в одной таблице присутствует идентификатор ID (для отсутствующих в других таблицах записей с идентификатором ID выводить пустое место или NULL).
Манипуляции с LEFT (RIGHT) JOIN не дали требуемого результата -- выводятся не все записи (может неправильно что-то делал).

Сейчас cначала создаю запрос с именем TU:
Код: Выделить всё

SELECT ID FROM T1
UNION
SELECT ID FROM T2
UNION
SELECT ID FROM T3;

После чего:
Код: Выделить всё

SELECT TU.ID, T1.F1, T2.F1, T3.F1, T1.F2, T2.F2, T3.F2
FROM ((TU LEFT JOIN T1 ON TU.ID=T1.ID)
LEFT JOIN T2 ON TU.ID=T2.ID)
LEFT JOIN T3 ON TU.ID=T3.ID;

Какие еще есть оптимальные варианты решения?

P.S. База Access (хотя на Transact-SQL тоже интересно).

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.10.2005 (Чт) 21:46

Попробуй, например, заменить все UNION на UNION ALL...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 06.10.2005 (Чт) 22:57

UNION ALL будет дублировать записи, которые существуют в разных таблицах.
Я, наверное, не очень понятно выразился. Написанный в первом сообщении вариант вполне рабочий. Но мне хотелось бы все сделать одним запросом.
Кроме того, у меня в таблицах около 30000 записей в каждой (что не так уж и много) и если я подставляю во второй запрос (с JOIN'aми) имя первого (TU), то выборка идет ооочень долго. Но если результат первого запроса с UNION'ами предварительно сохранить в отдельную табличку и уже её имя подставлять во второй запрос, то выборка идет несколько секунд -- не понимаю с чем это связано.

Выходит, для получения результата мне нужно:
1. Сделать UNION уникальных полей ID из всех таблиц (чтобы узнать все встречающиеся значения).
2. Сохранить результат в отдельную табличку.
3. Связать с этой временной таблицей LEFT JOIN'ом основные T1, T2, T3.

Вот я и спрашиваю совета: можно ли это как-то упростить?


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList  
cron