Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
join можно писать к таблицам без наличия PK и FK между ними. |
22 авг 19, 23:21 [21956087] Ответить | Цитировать Сообщить модератору |
adimmat Member Откуда: Таджикистан Сообщений: 180 |
Гавриленко Сергей Алексеевич, Спасибо большое за скорый ответ. А как же быть тогда с условием, который идет после ключ.слово ON? Если вам не сложно, не могли бы вы пример какой нибудь привести или хотя бы ссылку на какую нибудь реализацию? Спасибо! |
22 авг 19, 23:29 [21956092] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
adimmat, То условие, которое позволяет решить вашу задачу. А если не хотите, чтобы тут угадывали ее суть пару недель, будьте добры выполнить пункт 4 и пункт 6 из рекомендаций. |
22 авг 19, 23:38 [21956098] Ответить | Цитировать Сообщить модератору |
adimmat Member Откуда: Таджикистан Сообщений: 180 |
Гавриленко Сергей Алексеевич, Вот вид моих таблиц. В этих 5-ти таблицах значения полей не совпадают, единственное, в последней таблице Temp_Tab могут быть значения из всех таблиц. Результат, который я хочу получить: Это таблица в которой будут все поля из всех таблиц A,B,C,D,E, которые есть в таблице Temp_Tab. [img=] К сообщению приложен файл. Размер - 9Kb |
23 авг 19, 00:09 [21956108] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 419 |
PK и FK это инструменты поддержания целостности, связности и ограничений вашей бизнес логики. Они не мешают и не помогают вам делать запросы на таблицы. То, что вы говорите похоже на union. Прочитайте по этот вид соединения. Ну и не забывайте, что как только вы сольете все таблицы в одну вы не сможете сказать какая запись пришла из какой таблицы, если не учтете это при сливании. |
||
23 авг 19, 00:31 [21956113] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Да ну ладно, проще задачи не существует: 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] Ответить | Цитировать Сообщить модератору |
adimmat Member Откуда: Таджикистан Сообщений: 180 |
Гавриленко Сергей Алексеевич, Проблема в том, что UNION работает тогда, когда все поля из первой таблицы идентичны полям во второй. А у меня только 4 поля совпадают, остальные поля отличаются кардинально. Мне не 4 поля надо вытащить, а все поля из всех таблиц. Но, так как эти 4 поля во всех таблицах указывают на одну логику, а решил их не выводить по отдельности а пихнуть в одно поле финальной таблицы. Вот пример, со значениями. К сообщению приложен файл. Размер - 25Kb |
23 авг 19, 00:59 [21956122] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 419 |
Как вы представляете себе эти "other fielf from table ..."? Сервер должен угадать, их названия в исходных таблицах, в таблице объединения? Да и в вашем примере финальной таблицы логика объединения немного непонятна. Это рандом? Вы случайно хотите данные из таблицы а соединить с данными таблицы b по случайным полям? Как у вас id b2 соединилось с name аа? Если есть логика, то её надо озвучивать. |
||
23 авг 19, 01:23 [21956125] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 419 |
совершенно верно, если
|
||||
23 авг 19, 01:26 [21956126] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 419 |
Очень часто, когда что то очень очень не получается, означает, что хочется невозможного. Если у вас логи хранятся изначально в отдельных таблицах, то вынимать их все равно придется из отдельных таблиц. Хоть одним запросом, хоть пятью не будет разницы, так как читать придется все равно из пяти мест. Джойн не волшебная таблетка, это просто синтаксис, который говорит что читать и какие правила применять. Пять джойнов в одном запросе это все равно пять чтений все тех же пяти исходных таблиц. Синтаксически это удобнее и красивее, но минимально заметно сократить время работы не получится. Вам надо думать, как класть данные изначально в одну таблицу. зы. Конечно же вопрос в том, что эти существующие пять запросов могут быть не очень неэффективными, но это вопрос к запросам, а не к структуре данных. |
||
23 авг 19, 02:15 [21956130] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
На фоксе такие задачи решались через APPEND FROM. Но в любом случае нужен был список всех возможных полей в наборах таблиц. |
23 авг 19, 03:16 [21956134] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
В доинтернетную эру скидывали разные справочники с филиалов в головной офис. А местные умельцы имели практику дополнять таблички своими полями, которые надо было не потерять. Веселуха была еще та. |
23 авг 19, 03:19 [21956135] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
[quot adimmat]Есть 5-типов web-сервисов (S1,S2,S3,S4,S5), которые хранят свои логи в отдельных таблицах(T1,T2,T3,T4,T5). Задача в том, чтоб стандартизировать структуру логов отдельных сервисов, либо выбрать некий единый/центральный стандарт, к которому будут приводится данные с разных сервисов.
По идее и не должны.
Скорее всего это и есть "Объединитель"
Ну так если структура данных во всех случаях разная, то и будет "5 отдельных select-ов" которые можно запустить в разных местах для распараллеливания.
Быстрее не будет. + У тебя не задача JOIN, у тебя задача UNION |
||||||||
23 авг 19, 03:27 [21956136] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Неправильно прочитал. Вру. у конечно же тебя JOIN, а не UNION А кто/что мешает сделать: select A.id, A.name, A.description, A.value, A...., B...., C...., D...., E.... и далее связав Та же наверное знаешь список дополнительных полей каждой таблицы. |
23 авг 19, 03:37 [21956137] Ответить | Цитировать Сообщить модератору |
adimmat Member Откуда: Таджикистан Сообщений: 180 |
982183, Проблема в том, что у этих таблиц нет общих полей, чтоб я мог их связать. То есть, после условного оператора "ON" в JOIN-е я не представляю, что можно поставить учитывая структуру моих таблиц и то, что ни одно поле в таблице не ссылается на поле в другой таблице. |
23 авг 19, 09:24 [21956193] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
После ON следует ЛЮБОЕ условие, которое только вы сможете придумать. |
||
23 авг 19, 09:44 [21956206] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2395 |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
londinium Member Откуда: Киев Сообщений: 1195 |
adimmat,LEFT OUTER JOIN |
23 авг 19, 10:29 [21956248] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
LEFT JOIN |
||
23 авг 19, 11:05 [21956301] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3374 |
Как это "НЕТ", если выше ты пишешь
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] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2395 |
- что делать ? - попробуйте (А) или (Б) - спасибо! я делаю (С) почему-то ничего не выходит |
26 авг 19, 14:04 [21957643] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |