Объединить данные из двух таблиц с разным набором полей

Модераторы: kdv, CyberMax

Ответить
Vladgul
Сообщения: 12
Зарегистрирован: 01 дек 2004, 16:07

Объединить данные из двух таблиц с разным набором полей

Сообщение Vladgul » 18 апр 2007, 15:13

Есть две таблицы, у которых есть всего несколько одинаковых полей
типа id,DateTime, Msg

Но у каждой таблицы есть также другие поля
Например
В первой таблице есть:
Pole1 - integer,
Pole2 - var char,
Pole3 - var char

Во второй есть:
Pole10 - integer
Pole11 - var char
Pole12 - var char
Pole13 - var char

Вывести в результирующую выборку только
DateTime, Msg
Очень неинформативно

Вопросы:
1. Можно ли объединить поля в выборке с union что-то вроде этого:
Select (Msg + Pole11 +Pole12) Mess fom ....
Union
Select (Msg +Pole2 + Pole3) Mess from ....
Этот вариант не работает, но может быть сама идея возможна?

2. Попробовал создать View с одинаковыми названиями колонок.
Т.е. просматривая view, количество и названия колонок в одном View и в другом идентичны, но сделать между ними Union не получается.


3. Может есть какой либо другой способ показать данные из разных таблиц в одной выборке.


P.S.
Кратко описание задачи.
Есть две таблицы, которые содержат журнал работы системы
В одном журнал работы датчиков
В другом журнал работы системы контроля доступа (который, по структуре полей сильно отличается от первого журнала)
Иногда возникает необходимость просмотра полной хронологии событий из двух этих журналов в одной выборке. При этом надо вывести как можно больше информации в одной записи или из одного или из другого журнала.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 18 апр 2007, 16:04

RTFM FULL OUTER JOIN.
По-моему должно помочь.

Vladgul
Сообщения: 12
Зарегистрирован: 01 дек 2004, 16:07

Поясните пожалуйста

Сообщение Vladgul » 18 апр 2007, 16:23

Не могли бы вы пояснить более наглядно
с шаблоном запроса, как он должен выглядеть.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Объединить данные из двух таблиц с разным набором полей

Сообщение WildSery » 18 апр 2007, 16:25

Vladgul писал(а):Select (Msg + Pole11 +Pole12) Mess fom .... не работает
Зато Select (Msg || Pole11 || Pole12) Mess fom замечательно работает.

Vladgul
Сообщения: 12
Зарегистрирован: 01 дек 2004, 16:07

Сообщение Vladgul » 18 апр 2007, 16:36

To WildSery:

По отдельности работает,
а если я пытаюсь объединить два запроса
Select (Pole1 || Pole2) Msg from Table1
Union
Select (Pole1 || Pole3) Msg from Table 2

НЕ РАБОТАЕТ :(

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 апр 2007, 16:56

НЕ РАБОТАЕТ
прямо так и говорит - "я ваш запрос выполнять не буду"?
откуда у тебя Pole1 и Pole3 в Table2 ???

Vladgul
Сообщения: 12
Зарегистрирован: 01 дек 2004, 16:07

Сообщение Vladgul » 18 апр 2007, 17:53

kdv писал(а):
НЕ РАБОТАЕТ
прямо так и говорит - "я ваш запрос выполнять не буду"?
откуда у тебя Pole1 и Pole3 в Table2 ???
Немного отступил от своего стиля в начале.
Если в тех же терминах, то будет так

Select DateTime, (Msg || Pole2 || Pole3) Msg from Table1
Union
Select DateTime, (Msg || Pole11 || Pole12 || Pole13) Msg from Table 2

Не работает, так и говорит :?
"Invalid Token.
Dynamic SQL Error
Invalid Command.
Data Type unknown"

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 апр 2007, 20:56

при union
1. у запросов должно выбираться одинаковое количество столбцов
2. типы столбцов должны совпадать.

тип (длина) строка1+строка2 <> строка1+строка2+строка3.

кроме того, при union повторяющиеся строки убираются. Они у тебя есть?
В общем, иди лучше Грабера почитай.

Vladgul
Сообщения: 12
Зарегистрирован: 01 дек 2004, 16:07

Сообщение Vladgul » 19 апр 2007, 10:09

To kdv:
kdv писал(а):при union
1. у запросов должно выбираться одинаковое количество столбцов
2. типы столбцов должны совпадать.

тип (длина) строка1+строка2 <> строка1+строка2+строка3.

кроме того, при union повторяющиеся строки убираются. Они у тебя есть?
В общем, иди лучше Грабера почитай.
Так вопрос и звучал, как объединить разные по сути поля.

Может можно как-то привести тип или сделать view (опять же с приведением типа каким-то образом) или еще как нибудь.

А если вы хорошо разбираетесь в данной теме, то отсылать читать Грабера для того, чтобы ответить "Такое в принципе невозможно ни каким способом" или написать как можно сделать подобное, просто неккоректно с вашей стороны.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 19 апр 2007, 10:17

Vladgul писал(а):А если вы хорошо разбираетесь в данной теме, то отсылать читать Грабера для того, чтобы ответить "Такое в принципе невозможно ни каким способом" или написать как можно сделать подобное, просто неккоректно с вашей стороны.
А с твоей стороны хорошо задавать вопры по азам SQL? Да ещё требовать ответа у человека, который тебе ничего не должен и вообще с тобой незнаком?
Если ты занимаешься этим, то по крайней мере первоисточник должен знать, хотя бы основные возможности.

Как Дмитрий уже сказал, клеить возможно, и даже указал условия для этого.
А ты даже не попробовав вникнуть уже возмущаешься.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 апр 2007, 16:37

в постановке вопроса я пока не вижу логики. Склеить из одной таблицы 2 столбца, а из второй - 3 или 4, и вывести это одним запросом?
Что это за данные такие?
просто неккоректно с вашей стороны.
я Вам тут ничем не обязан. Как и остальные участники форума. WildSery правильно сказал - сначала надо изучить азы. На что я вполне корректно намекнул.
Ну и, на абстрактный вопрос дан не менее абстрактный ответ.
Может можно как-то привести тип
да, можете использовать cast.

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 19 апр 2007, 16:44

пока топик не удалали скажу что приведение типов делается через cast :roll:

получится что-то вроде

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

Select DateTime, cast(Msg || Pole2 || Pole3 as varchar(100)) Msg from Table1
Union
Select DateTime, cast(Msg || Pole11 || Pole12 || Pole13 as varchar(100)) Msg from Table 2 

Vladgul
Сообщения: 12
Зарегистрирован: 01 дек 2004, 16:07

Сообщение Vladgul » 20 апр 2007, 11:09

Attid писал(а):пока топик не удалали скажу что приведение типов делается через cast :roll:

получится что-то вроде

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

Select DateTime, cast(Msg || Pole2 || Pole3 as varchar(100)) Msg from Table1
Union
Select DateTime, cast(Msg || Pole11 || Pole12 || Pole13 as varchar(100)) Msg from Table 2 
Только собрался сам написать как это организовал, но не успел, так как это в точности совпадает с ответом Attid

По моему вопрос был задан не абстрактный, а вполне конкретный и ответ на него приведен выше. Вполне конкретный ответ.

To Kdv:
В постановке вопроса специально расписал в P.S. описание задачи, для чего это мне нужно. И что возникает такая проблема не всегда, а только в крайнем случае, когда нужно получить точную хронологию событий из двух разных по сути таблиц. И естественно их нельзя объединить в классическом представлении Union.

А мое возмущение вызвано не тем, что кто-то мне чем-то обязан, должен ответить но не отвечает. А тем, что если вам не охота расписать "чайнику", как просто это можно сделать, то просто не надо отписываться общими ответами типа "учи мат.часть", с чем я еще согласился бы, если вопрос был совсем тривиальным типа соединить в выборку две ОДИНАКОВЫЕ таблицы.

Без обид. :?:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 20 апр 2007, 11:59

В постановке вопроса специально расписал в P.S. описание задачи, для чего это мне нужно.
то есть, ты задаешь вопрос, а мы тебе его должны сделать и расписать? :)
если вопрос был совсем тривиальным типа соединить в выборку две ОДИНАКОВЫЕ таблицы.
ничего нетривиального не вижу. я еще раз говорю - надо читать документацию и Грабера.

Форум предназначен для ответов на вопросы, которых нет в FAQ и в документации.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 20 апр 2007, 12:03

Vladgul писал(а):В постановке вопроса специально расписал в P.S. описание задачи, для чего это мне нужно.
Ты сам перечитай ещё раз, но на этот раз беспристрастно, напоминая себе, что не знаешь ничего ни про датчики, ни про всё то, что ты уже обдумал до форума.
Фраза "полная хронология событий из двух журналов в одной выборке" конечно же всё объясняет (сарказм).
Вот если бы ты просто картинку нарисовал, что тебе примерно нужно получить на выходе - я думаю, вместо всей полемики был бы сразу готовый совет, как обойти сложности, на которые ты наткнулся.
А так наполовину топик состоит из упражнений в телепатии, ведь очевидные для тебя вещи нам неизвестны.

Ответить