Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка из неск-х таблиц, в один набор данных 
:(
    Опции темы
Ignat
Дата 15.9.2004, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: нет
Всего: 73



Многоуважаемый 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?
Если есть мысли - пишите, любая идея мне интересна.

Спасибо!



--------------------
Теперь при чем :P
PM   Вверх
boevik
Дата 15.9.2004, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 6
Всего: 35



Ignat, уверен что UNION не прокатывает?
А если так:
Код

SELECT id,name,description,flag, NULL, NULL, NULL, NULL, NULL
FROM table1
SELECT NULL, NULL, NULL, NULL, id,name,content,date,flag
FROM table2


Или full join для связи двух тавлиц по id
Код
SELECT *
FROM table1 FULL JOIN table2 ON table1.id = table2.id



--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Akina
Дата 15.9.2004, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Ignat
Если одноименные поля еще и одинаковые данные хранят - то какого черта? вынести в отдельную таблицу и привязать к ней различающиеся данные. Выборку делать тупым множественным inner join.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ignat
Дата 15.9.2004, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: нет
Всего: 73



boevik, подозреваю, что я не правильно изложил проблему.
Первый запрос даст набор данных в таком виде (если я не путаю):
Цитата
  id,    name,  description,  flag,      id,  name,  content,          date,      flag
    1,    some,            text,    01, NULL,    NULL,      NULL,          NULL,    NULL
NULL,  NULL,          NULL, NULL,      3,s_name,  big_text,2004-01-01,      11


А можно ли такой результат получить?
Код
  id,     name,  description,   flag,    content,           date  
   1,     some,             text,    01,         NULL,          NULL  
  3,  s_name,           NULL,    11,    big_text, 2004-01-01


C full join'ом проблема - в MySQL его нет, а попросил я в SQL92, потому что меня устраивают подселекты (в отличие от MYSQL), хотя это в данном случае мало чем может помочь.


--------------------
Теперь при чем :P
PM   Вверх
boevik
Дата 15.9.2004, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 6
Всего: 35



Тогда так:
Код
SELECT id,name,description,flag, NULL, NULL, NULL
FROM table1
SELECT id,name, NULL, NULL, content,date,flag
FROM table2


Если есть одинаковые ID, то что надо получить?



--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Ignat
Дата 15.9.2004, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: нет
Всего: 73



Akina, не выйдет - это таблицы разных модулей, а будут ли они зависит от конфигурации.

boevik, имена таблиц из которых будет выборка я получаю запросом перед этим. Т.е. к моменту выборки данных я не знаю какие таблицы участвуют в запросе, и, лишь, после первого запроса буду знать.

Сейчас думаю, чем так извращаться, наверное, надо сделать таблицы с одинаковой стуктурой, хоть и с избыточными данными.

Это сообщение отредактировал(а) Ignat - 15.9.2004, 12:27


--------------------
Теперь при чем :P
PM   Вверх
<Spawn>
Дата 15.9.2004, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Ignat А чем тебе UNION не нравиться? Или я тоже тебя не правильно понялsmile.gif ?
П.С. Если опять не то, то приведи полные исходные данные и конечные. Так будет понятнее.

Это сообщение отредактировал(а) <Spawn> - 15.9.2004, 13:22


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Akina
Дата 15.9.2004, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Ignat
Цитата
это таблицы разных модулей

В таком случае где гарантия что записи из таблиц с одинаковым, к примеру, ID, содержат также одинаковые name и flag? или это ГАРАНТИРОВАНО?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ignat
Дата 15.9.2004, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: нет
Всего: 73



Код
CREATE TABLE bl2mod (
 bl_id int(11) unsigned NOT NULL default '0',
 rec_id int(11) unsigned NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE blocks (
 id int(11) unsigned NOT NULL auto_increment,
 name varchar(255) NOT NULL default '',
 template int(11) unsigned NOT NULL default '0',
 mod_id int(11) unsigned NOT NULL default '0',
 PRIMARY KEY  (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE hierarhy (
 id int(11) unsigned NOT NULL auto_increment,
 name varchar(255) NOT NULL default '',
 title varchar(255) NOT NULL default '',
 cleft int(11) unsigned NOT NULL default '0',
 cright int(11) unsigned NOT NULL default '0',
 clevel int(11) unsigned NOT NULL default '0',
 flags int(16) unsigned NOT NULL default '0',
 template int(11) unsigned NOT NULL default '0',
 `date` datetime NOT NULL default '0000-00-00 00:00:00',
 PRIMARY KEY  (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE modules (
 id int(11) unsigned NOT NULL auto_increment,
 name varchar(255) NOT NULL default '',
 flags int(16) unsigned NOT NULL default '0',
 table_name varchar(255) NOT NULL default '',
 PRIMARY KEY  (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE news (
 id int(11) unsigned NOT NULL auto_increment,
 content text NOT NULL,
 `start` datetime NOT NULL default '0000-00-00 00:00:00',
 finish datetime NOT NULL default '0000-00-00 00:00:00',
 period int(5) NOT NULL default '0',
 flags int(16) NOT NULL default '0',
 PRIMARY KEY  (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE o2bl (
 obj_id int(11) unsigned NOT NULL default '0',
 bl_id int(11) unsigned NOT NULL default '0'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE static (
 id int(11) unsigned NOT NULL auto_increment,
 content text NOT NULL,
 flags int(16) NOT NULL default '0',
 PRIMARY KEY  (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Это таблицы, их больше, но остальные не принципиальны в данный момент.
Запрос №1:
Код
SELECT blocks.id, modules.table_name
FROM modules, blocks, o2bl
WHERE modules.id = blocks.mod_id AND blocks.id = o2bl.bl_id AND o2bl.obj_id = (
SELECT c.id
FROM `hierarhy` a, `hierarhy` b, `hierarhy` c
WHERE c.cleft
BETWEEN b.cleft AND b.cright AND c.title = 'licens' AND b.cleft
BETWEEN a.cleft AND a.cright AND b.title = 'about' AND a.clevel = 1 AND a.title = 'root' );

С этого я поимел имена таблиц, e.g. news и static.

Теперь мне как-то надо состряпать новый запрос, чтобы выбрать конечные данные из таблиц, например, news и static в один набор данных.

<Spawn>, UNION позволяет объединить результаты запросов при полном совпадении структур данных, или я не прав?

Добавлено @ 13:54
Akina, id гарантированно, флажки - нет.

Добавлено @ 13:58
что-то я хреново объясняю.
у меня есть желание, чтоб при объединении таблиц, при совпадении имен полей данные клались в одно и тоже поле, но в разных строках, если совпадений по полям нет, то появится такое поле, где для строчек из другой таблицы стоит NULL.

Блин, всё равно фраза мутная.


--------------------
Теперь при чем :P
PM   Вверх
<Spawn>
Дата 15.9.2004, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



При использовании UNION необходимо лишь, чтобы типы выбираемых полей каждого селекта совпадали и было одинаковое количество выбираемых полей, то есть тебе, как уже сказал boevik, нужно сделать следующее:

SELECT id, name, description, NULL, NULL
FROM table1
UNION
SELECT id, name, NULL, NULL, content
FROM table2

т.е. за место несуществующих полей подставляешь NULL, который совместим со всеми типами данных

П.С. To Admin - чего то не то с парсером SQL кода - вырезается ключевое слово UNION

Это сообщение отредактировал(а) <Spawn> - 15.9.2004, 14:59


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Ignat
Дата 15.9.2004, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: нет
Всего: 73



Спасибо всем. Наконец догнал smile.gif


--------------------
Теперь при чем :P
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.