Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Соединение несвязных таблиц в один запрос.  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
Доброго времени суток, друзья.
Нужна ваша помощь при решение одной проблемы.
У меня есть 5 таблиц в БД (A,B,C,D,E) и одна временная таблица (temp_tab).
Таблицы БД не связаны между собой никак, то есть нет никаких PK и FK, ссылающиеся друг на друга.
Единственное, что похоже на связь между ними, так это то, что в каждой из этих таблиц есть поля названия которых совпадают с полями в других таблицах и это все.
Например:
A (id, name, description, value ....)
B (id, name, description, value ....)
C (id, name, description, value ....)
D (id, name, description, value ....)
E (id, name, description, value ....)

Во временной таблице будут только эти поля:
temp_tab (id, name, description, value).

Чтобы достать данные из этих таблиц, мне придется писать 5 отдельных select-ов и сравнивать, есть ли они во временной таблице.

Вопрос в след:
Как сделать так, чтоб в итоге я получил след:
Final_Table (id, name, description, value, и все остальные поля из таблиц (B,C,D,E))?

Буду благодарен за любой совет по вопросу и любую подсказку по решению.
22 авг 19, 23:07    [21956080]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36695
join можно писать к таблицам без наличия PK и FK между ними.
22 авг 19, 23:21    [21956087]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
Гавриленко Сергей Алексеевич, Спасибо большое за скорый ответ. А как же быть тогда с условием, который идет после ключ.слово ON?
Если вам не сложно, не могли бы вы пример какой нибудь привести или хотя бы ссылку на какую нибудь реализацию?
Спасибо!
22 авг 19, 23:29    [21956092]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36695
adimmat,

То условие, которое позволяет решить вашу задачу.
А если не хотите, чтобы тут угадывали ее суть пару недель, будьте добры выполнить пункт 4 и пункт 6 из рекомендаций.
22 авг 19, 23:38    [21956098]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
Гавриленко Сергей Алексеевич,
Вот вид моих таблиц.
В этих 5-ти таблицах значения полей не совпадают, единственное, в последней таблице Temp_Tab могут быть значения из всех таблиц.
Результат, который я хочу получить: Это таблица в которой будут все поля из всех таблиц A,B,C,D,E, которые есть в таблице Temp_Tab.
[img=]

К сообщению приложен файл. Размер - 9Kb
23 авг 19, 00:09    [21956108]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
adimmat
нет никаких PK и FK.


PK и FK это инструменты поддержания целостности, связности и ограничений вашей бизнес логики. Они не мешают и не помогают вам делать запросы на таблицы.

То, что вы говорите похоже на union. Прочитайте по этот вид соединения. Ну и не забывайте, что как только вы сольете все таблицы в одну вы не сможете сказать какая запись пришла из какой таблицы, если не учтете это при сливании.
23 авг 19, 00:31    [21956113]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36695
PizzaPizza
Ну и не забывайте, что как только вы сольете все таблицы в одну вы не сможете сказать какая запись пришла из какой таблицы, если не учтете это при сливании.

Да ну ладно, проще задачи не существует:

select
  a.*
  , table_name = 'Table1'
from Table1 a
union all
select
  b.*
  , table_name = 'Table2'
from Table2 b
...
union all
select
  z.*
  , table_name = 'Table26'
from Table26 z
23 авг 19, 00:48    [21956117]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
Гавриленко Сергей Алексеевич,
Проблема в том, что UNION работает тогда, когда все поля из первой таблицы идентичны полям во второй. А у меня только 4 поля совпадают, остальные поля отличаются кардинально. Мне не 4 поля надо вытащить, а все поля из всех таблиц. Но, так как эти 4 поля во всех таблицах указывают на одну логику, а решил их не выводить по отдельности а пихнуть в одно поле финальной таблицы.
Вот пример, со значениями.

К сообщению приложен файл. Размер - 25Kb
23 авг 19, 00:59    [21956122]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
adimmat
остальные поля отличаются кардинально. Мне не 4 поля надо вытащить, а все поля из всех таблиц. Но, так как эти 4 поля во всех таблицах указывают на одну логику, а решил их не выводить по отдельности а пихнуть в одно поле финальной таблицы.
Вот пример, со значениями.


Как вы представляете себе эти "other fielf from table ..."? Сервер должен угадать, их названия в исходных таблицах, в таблице объединения?

Да и в вашем примере финальной таблицы логика объединения немного непонятна. Это рандом? Вы случайно хотите данные из таблицы а соединить с данными таблицы b по случайным полям? Как у вас id b2 соединилось с name аа? Если есть логика, то её надо озвучивать.
23 авг 19, 01:23    [21956125]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Гавриленко Сергей Алексеевич
Да ну ладно, проще задачи не существует:

совершенно верно, если
PizzaPizza
учтете это при сливании.
23 авг 19, 01:26    [21956126]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
PizzaPizza, Данные тут все рандомные.
А реальная задача такова:
Есть 5-типов web-сервисов (S1,S2,S3,S4,S5), которые хранят свои логи в отдельных таблицах(T1,T2,T3,T4,T5). Логи одного сервиса не могут попасть в таблицу логов другого сервиса.
Есть программа которая собирает все эти логи и генерит один общий лог по работе всех сервисов и кидает все в одну временную таблицу (Temp_Tab). Так вот, в этой программе сейчас для сбора всех логов написали 5 отдельных select-ов, а это как вы понимаете, занимает очень много времени.
Я хочу вместо этих 5-и написать 1 select (Ну максимум 2), чтоб сократить время работы.
Подсказали, что с JOIN-ом можно, но вот в JOIN-е нужны "общие поля", чтоб подставить после ON для указания связи. А в таблицах T1,T2,T3,T4,T5 нет ничего общего и не может быть, так как там хранятся логи по работе конкретного сервиса.
23 авг 19, 01:36    [21956127]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
adimmat
PizzaPizza, Данные тут все рандомные.
А реальная задача такова:
Есть 5-типов web-сервисов (S1,S2,S3,S4,S5), которые хранят свои логи в отдельных таблицах(T1,T2,T3,T4,T5). Логи одного сервиса не могут попасть в таблицу логов другого сервиса.

Есть программа которая собирает все эти логи и генерит один общий лог по работе всех сервисов и кидает все в одну временную таблицу (Temp_Tab). Так вот, в этой программе сейчас для сбора всех логов написали 5 отдельных select-ов, а это как вы понимаете, занимает очень много времени.
Я хочу вместо этих 5-и написать 1 select (Ну максимум 2), чтоб сократить время работы.
Подсказали, что с JOIN-ом можно, но вот в JOIN-е нужны "общие поля", чтоб подставить после ON для указания связи. А в таблицах T1,T2,T3,T4,T5 нет ничего общего и не может быть, так как там хранятся логи по работе конкретного сервиса.


Очень часто, когда что то очень очень не получается, означает, что хочется невозможного.

Если у вас логи хранятся изначально в отдельных таблицах, то вынимать их все равно придется из отдельных таблиц. Хоть одним запросом, хоть пятью не будет разницы, так как читать придется все равно из пяти мест. Джойн не волшебная таблетка, это просто синтаксис, который говорит что читать и какие правила применять. Пять джойнов в одном запросе это все равно пять чтений все тех же пяти исходных таблиц. Синтаксически это удобнее и красивее, но минимально заметно сократить время работы не получится.

Вам надо думать, как класть данные изначально в одну таблицу.

зы. Конечно же вопрос в том, что эти существующие пять запросов могут быть не очень неэффективными, но это вопрос к запросам, а не к структуре данных.
23 авг 19, 02:15    [21956130]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
982183
Member

Откуда: VL
Сообщений: 3350
На фоксе такие задачи решались через APPEND FROM.
Но в любом случае нужен был список всех возможных полей в наборах таблиц.
23 авг 19, 03:16    [21956134]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
982183
Member

Откуда: VL
Сообщений: 3350
В доинтернетную эру скидывали разные справочники с филиалов в головной офис.
А местные умельцы имели практику дополнять таблички своими полями, которые надо было не потерять.
Веселуха была еще та.
23 авг 19, 03:19    [21956135]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
982183
Member

Откуда: VL
Сообщений: 3350
[quot adimmat]Есть 5-типов web-сервисов (S1,S2,S3,S4,S5), которые хранят свои логи в отдельных таблицах(T1,T2,T3,T4,T5).
Задача в том, чтоб стандартизировать структуру логов отдельных сервисов,
либо выбрать некий единый/центральный стандарт, к которому будут приводится данные с разных сервисов.
adimmat
Логи одного сервиса не могут попасть в таблицу логов другого сервиса.

По идее и не должны.
adimmat
Есть программа которая собирает все эти логи и генерит один общий лог по работе всех сервисов и кидает все в одну временную таблицу (Temp_Tab).

Скорее всего это и есть "Объединитель"
adimmat
Так вот, в этой программе сейчас для сбора всех логов написали 5 отдельных select-ов, а это как вы понимаете, занимает очень много времени.

Ну так если структура данных во всех случаях разная, то и будет "5 отдельных select-ов"
которые можно запустить в разных местах для распараллеливания.
adimmat
Я хочу вместо этих 5-и написать 1 select (Ну максимум 2), чтоб сократить время работы.

Быстрее не будет.
+ У тебя не задача JOIN, у тебя задача UNION
23 авг 19, 03:27    [21956136]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Неправильно прочитал.
Вру. у конечно же тебя JOIN, а не UNION

А кто/что мешает сделать:

select A.id, A.name, A.description, A.value, A...., B...., C...., D...., E....
и далее связав

Та же наверное знаешь список дополнительных полей каждой таблицы.
23 авг 19, 03:37    [21956137]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
982183, Проблема в том, что у этих таблиц нет общих полей, чтоб я мог их связать. То есть, после условного оператора "ON" в JOIN-е я не представляю, что можно поставить учитывая структуру моих таблиц и то, что ни одно поле в таблице не ссылается на поле в другой таблице.
23 авг 19, 09:24    [21956193]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
adimmat
982183, Проблема в том, что у этих таблиц нет общих полей, чтоб я мог их связать. То есть, после условного оператора "ON" в JOIN-е я не представляю, что можно поставить учитывая структуру моих таблиц и то, что ни одно поле в таблице не ссылается на поле в другой таблице.
Забудьте вы про слово "ссылается".
После ON следует ЛЮБОЕ условие, которое только вы сможете придумать.
23 авг 19, 09:44    [21956206]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2375
adimmat,

1) сливаем вам остальные поля в текст (бинари)

select
  id, name, description, value , cast(field_z as nvarchar) + (cast field_y as nvarchar) as common_field
  , table_name = 'Table1'
from Table1 a
union all
select
 id, name, description, value , cast(field_x as nvarchar) + (cast field_t as nvarchar) as common_field
  , table_name = 'Table2'
from Table2 b
...


2) генерим все поля в итговой таблице

select
  id, name, description, value , field_z, field_y , null as field_x, null as field_t
  , table_name = 'Table1'
from Table1 a
union all
select
  id, name, description, value , null as field_z, null as field_y ,   field_x,   field_t
  , table_name = 'Table2'
from Table2 b
...
23 авг 19, 09:44    [21956207]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
adimmat
Member

Откуда: Таджикистан
Сообщений: 180
StarikNavy, Спасибо за приведенный пример. Я сам попробовал через OUTER JOIN писать. Только вот получаю ошибку в OUTER-е.
Подскажите,плз, в правильном направлении я иду? И в чем может быть причина ошибки, с этим OUTER-ом?
Вот мой запрос:

SELECT A.*,
       B.*
FROM A 
        INNER JOIN temp_tab ON A.OPERATION_ID = temp_tab.OPERATION_ID AND 
                                  A.sys_code = temp_tab.sys_code AND 
                                  A.message_id = temp_tab.message_id
        OUTER JOIN B ON temp_tab.OPERATION_ID = B.OPERATION_ID AND 
                                   temp_tab.sys_code = B.sys_code AND 
                                   temp_tab.message_id = B.message_id
23 авг 19, 10:18    [21956237]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
londinium
Member

Откуда: Киев
Сообщений: 1138
adimmat,
LEFT OUTER JOIN
23 авг 19, 10:29    [21956248]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
londinium
adimmat,
LEFT OUTER JOIN
Ещё короче:
LEFT JOIN
23 авг 19, 11:05    [21956301]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
982183
Member

Откуда: VL
Сообщений: 3350
adimmat
Проблема в том, что у этих таблиц нет общих полей, чтоб я мог их связать.

Как это "НЕТ", если выше ты пишешь
adimmat
в каждой из этих таблиц есть поля названия которых совпадают с полями в других таблицах


id, name, description, value "это и есть общие поля"

Если правильно понимаю твою задачу, что не есть факт.

В простейшем и неправильном виде это может выглядеть так:
select A.*,B.*,C.*,D.*,E.*
from A,B,C,D,E
where A.id=B.id and A.id=C.id and A.id=D.id and  A.id=E.id and
A.name=B.name and A.name=C.name and A.name=D.name and  A.id=E.name and
A.description=B.description and A.description=C.description and A.description=D.description and  A.description=E.description and
A.value=B.value and A.value=C.value and A.value=D.value and  A.value=E.value 


Вроде бред, но наглядно.

А далее, в зависимости от того, как как встречаются "общие"/"идентифицирующие" данные по разным логам
думай о том. как то сделать через JOIN с LEFTом или без.
25 авг 19, 15:05    [21957220]     Ответить | Цитировать Сообщить модератору
 Re: Соединение несвязных таблиц в один запрос.  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2375
- что делать ?
- попробуйте (А) или (Б)
- спасибо! я делаю (С) почему-то ничего не выходит
26 авг 19, 14:04    [21957643]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить