| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > СУБД, общие вопросы > Выборка из неск-х таблиц |
| Автор: Ignat 15.9.2004, 10:55 |
| Многоуважаемый ALL! Возникла такая необходимость получить одним селектом один набор данных из нескольких таблиц с разной структурой, но при этом в этих таблицах некоторые поля одноименные. Например: table1 id,name,description,flag table2 id,name,content,date,flag соединение таблиц даст набор данных, например: id,name,description,flag,id,name,content,date,flag т.е. произведение. UNION, само собой, не прокатывает из-за разницы в структуре. а можно ли получить такой набор данных, в котором структура будет результирующей, например: id,name,description,flag,content,date соответственно в тех строках, которые взяты из первой таблицы content и date будут NULL аналогично для строк из второй. Вообще возможно такое в SQL92? Если есть мысли - пишите, любая идея мне интересна. Спасибо! |
| Автор: boevik 15.9.2004, 11:08 | ||||
| Ignat, уверен что UNION не прокатывает? А если так:
Или full join для связи двух тавлиц по id
|
| Автор: Akina 15.9.2004, 11:31 |
| Ignat Если одноименные поля еще и одинаковые данные хранят - то какого черта? вынести в отдельную таблицу и привязать к ней различающиеся данные. Выборку делать тупым множественным inner join. |
| Автор: Ignat 15.9.2004, 11:50 | ||||
| boevik, подозреваю, что я не правильно изложил проблему. Первый запрос даст набор данных в таком виде (если я не путаю):
А можно ли такой результат получить?
C full join'ом проблема - в MySQL его нет, а попросил я в SQL92, потому что меня устраивают подселекты (в отличие от MYSQL), хотя это в данном случае мало чем может помочь. |
| Автор: boevik 15.9.2004, 12:12 | ||
Тогда так:
Если есть одинаковые ID, то что надо получить? |
| Автор: Ignat 15.9.2004, 12:26 |
| Akina, не выйдет - это таблицы разных модулей, а будут ли они зависит от конфигурации. boevik, имена таблиц из которых будет выборка я получаю запросом перед этим. Т.е. к моменту выборки данных я не знаю какие таблицы участвуют в запросе, и, лишь, после первого запроса буду знать. Сейчас думаю, чем так извращаться, наверное, надо сделать таблицы с одинаковой стуктурой, хоть и с избыточными данными. |
| Автор: <Spawn> 15.9.2004, 13:21 |
| Ignat А чем тебе UNION не нравиться? Или я тоже тебя не правильно понял П.С. Если опять не то, то приведи полные исходные данные и конечные. Так будет понятнее. |
| Автор: Akina 15.9.2004, 13:45 | ||
Ignat
В таком случае где гарантия что записи из таблиц с одинаковым, к примеру, ID, содержат также одинаковые name и flag? или это ГАРАНТИРОВАНО? |
| Автор: Ignat 15.9.2004, 13:52 | ||||
Это таблицы, их больше, но остальные не принципиальны в данный момент. Запрос №1:
С этого я поимел имена таблиц, e.g. news и static. Теперь мне как-то надо состряпать новый запрос, чтобы выбрать конечные данные из таблиц, например, news и static в один набор данных. <Spawn>, UNION позволяет объединить результаты запросов при полном совпадении структур данных, или я не прав? Добавлено @ 13:54 Akina, id гарантированно, флажки - нет. Добавлено @ 13:58 что-то я хреново объясняю. у меня есть желание, чтоб при объединении таблиц, при совпадении имен полей данные клались в одно и тоже поле, но в разных строках, если совпадений по полям нет, то появится такое поле, где для строчек из другой таблицы стоит NULL. Блин, всё равно фраза мутная. |
| Автор: <Spawn> 15.9.2004, 14:31 |
| При использовании UNION необходимо лишь, чтобы типы выбираемых полей каждого селекта совпадали и было одинаковое количество выбираемых полей, то есть тебе, как уже сказал boevik, нужно сделать следующее: SELECT id, name, description, NULL, NULL FROM table1 UNION SELECT id, name, NULL, NULL, content FROM table2 т.е. за место несуществующих полей подставляешь NULL, который совместим со всеми типами данных П.С. To Admin - чего то не то с парсером SQL кода - вырезается ключевое слово UNION |
| Автор: Ignat 15.9.2004, 14:42 |
| Спасибо всем. Наконец догнал |