Объединить данные из двух таблиц с разным набором полей
Объединить данные из двух таблиц с разным набором полей
Есть две таблицы, у которых есть всего несколько одинаковых полей
типа 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.
Кратко описание задачи.
Есть две таблицы, которые содержат журнал работы системы
В одном журнал работы датчиков
В другом журнал работы системы контроля доступа (который, по структуре полей сильно отличается от первого журнала)
Иногда возникает необходимость просмотра полной хронологии событий из двух этих журналов в одной выборке. При этом надо вывести как можно больше информации в одной записи или из одного или из другого журнала.
типа 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.
Кратко описание задачи.
Есть две таблицы, которые содержат журнал работы системы
В одном журнал работы датчиков
В другом журнал работы системы контроля доступа (который, по структуре полей сильно отличается от первого журнала)
Иногда возникает необходимость просмотра полной хронологии событий из двух этих журналов в одной выборке. При этом надо вывести как можно больше информации в одной записи или из одного или из другого журнала.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Поясните пожалуйста
Не могли бы вы пояснить более наглядно
с шаблоном запроса, как он должен выглядеть.
с шаблоном запроса, как он должен выглядеть.
Re: Объединить данные из двух таблиц с разным набором полей
Зато Select (Msg || Pole11 || Pole12) Mess fom замечательно работает.Vladgul писал(а):Select (Msg + Pole11 +Pole12) Mess fom .... не работает
Немного отступил от своего стиля в начале.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"
To kdv:
Может можно как-то привести тип или сделать view (опять же с приведением типа каким-то образом) или еще как нибудь.
А если вы хорошо разбираетесь в данной теме, то отсылать читать Грабера для того, чтобы ответить "Такое в принципе невозможно ни каким способом" или написать как можно сделать подобное, просто неккоректно с вашей стороны.
Так вопрос и звучал, как объединить разные по сути поля.kdv писал(а):при union
1. у запросов должно выбираться одинаковое количество столбцов
2. типы столбцов должны совпадать.
тип (длина) строка1+строка2 <> строка1+строка2+строка3.
кроме того, при union повторяющиеся строки убираются. Они у тебя есть?
В общем, иди лучше Грабера почитай.
Может можно как-то привести тип или сделать view (опять же с приведением типа каким-то образом) или еще как нибудь.
А если вы хорошо разбираетесь в данной теме, то отсылать читать Грабера для того, чтобы ответить "Такое в принципе невозможно ни каким способом" или написать как можно сделать подобное, просто неккоректно с вашей стороны.
А с твоей стороны хорошо задавать вопры по азам SQL? Да ещё требовать ответа у человека, который тебе ничего не должен и вообще с тобой незнаком?Vladgul писал(а):А если вы хорошо разбираетесь в данной теме, то отсылать читать Грабера для того, чтобы ответить "Такое в принципе невозможно ни каким способом" или написать как можно сделать подобное, просто неккоректно с вашей стороны.
Если ты занимаешься этим, то по крайней мере первоисточник должен знать, хотя бы основные возможности.
Как Дмитрий уже сказал, клеить возможно, и даже указал условия для этого.
А ты даже не попробовав вникнуть уже возмущаешься.
в постановке вопроса я пока не вижу логики. Склеить из одной таблицы 2 столбца, а из второй - 3 или 4, и вывести это одним запросом?
Что это за данные такие?
Ну и, на абстрактный вопрос дан не менее абстрактный ответ.
Что это за данные такие?
я Вам тут ничем не обязан. Как и остальные участники форума. WildSery правильно сказал - сначала надо изучить азы. На что я вполне корректно намекнул.просто неккоректно с вашей стороны.
Ну и, на абстрактный вопрос дан не менее абстрактный ответ.
да, можете использовать cast.Может можно как-то привести тип
пока топик не удалали скажу что приведение типов делается через cast
получится что-то вроде
получится что-то вроде
Код: Выделить всё
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
Только собрался сам написать как это организовал, но не успел, так как это в точности совпадает с ответом AttidAttid писал(а):пока топик не удалали скажу что приведение типов делается через cast
получится что-то вродеКод: Выделить всё
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
По моему вопрос был задан не абстрактный, а вполне конкретный и ответ на него приведен выше. Вполне конкретный ответ.
To Kdv:
В постановке вопроса специально расписал в P.S. описание задачи, для чего это мне нужно. И что возникает такая проблема не всегда, а только в крайнем случае, когда нужно получить точную хронологию событий из двух разных по сути таблиц. И естественно их нельзя объединить в классическом представлении Union.
А мое возмущение вызвано не тем, что кто-то мне чем-то обязан, должен ответить но не отвечает. А тем, что если вам не охота расписать "чайнику", как просто это можно сделать, то просто не надо отписываться общими ответами типа "учи мат.часть", с чем я еще согласился бы, если вопрос был совсем тривиальным типа соединить в выборку две ОДИНАКОВЫЕ таблицы.
Без обид.
то есть, ты задаешь вопрос, а мы тебе его должны сделать и расписать?В постановке вопроса специально расписал в P.S. описание задачи, для чего это мне нужно.
ничего нетривиального не вижу. я еще раз говорю - надо читать документацию и Грабера.если вопрос был совсем тривиальным типа соединить в выборку две ОДИНАКОВЫЕ таблицы.
Форум предназначен для ответов на вопросы, которых нет в FAQ и в документации.
Ты сам перечитай ещё раз, но на этот раз беспристрастно, напоминая себе, что не знаешь ничего ни про датчики, ни про всё то, что ты уже обдумал до форума.Vladgul писал(а):В постановке вопроса специально расписал в P.S. описание задачи, для чего это мне нужно.
Фраза "полная хронология событий из двух журналов в одной выборке" конечно же всё объясняет (сарказм).
Вот если бы ты просто картинку нарисовал, что тебе примерно нужно получить на выходе - я думаю, вместо всей полемики был бы сразу готовый совет, как обойти сложности, на которые ты наткнулся.
А так наполовину топик состоит из упражнений в телепатии, ведь очевидные для тебя вещи нам неизвестны.