|
|
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
Коллеги, добрый день Есть две однотипных таблицы в двух разных БД. Таблица в первой БД является подмножеством (по первичному ключу) таблицы в другой БД. Требуется решение, которое позволит делать на лету такой UNION, чтобы в случае наличия записей в первой таблице, записи из второй таблицы не попадали в вывод в случае совпадения первичных ключей, даже в случае различия в неключевых полях. Пример ниже. Основное требование - нужно готовое решение типа промежуточной виртуальной БД с ODBC интерфейсом. Рассматривал OpenLink Virtuoso Universal Server, но пока так и не понял, как эффективно сделать такой UNION. Добавлю, что имеется более 100 таблиц, в связи с чем руками писать SQL для каждой таблицы неразумно. Уверен, что задача типовая, но на данный момент удобного решения не нашел. Буду рад любым комментариям и ссылкам. Спасибо. Таблица A ID Date ------------- 1 1/1/2014 2 2/1/2014 3 3/1/2014 5 8/1/2014 Таблица B ID Date ------------ 1 1/1/2014 2 9/1/2014 3 5/1/2014 4 1/2/2014 Результат объединения типа UNION таблиц A и B Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 11:35 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
vitprofКоллеги, добрый день Есть две однотипных таблицы в двух разных БД. Таблица в первой БД является подмножеством (по первичному ключу) таблицы в другой БД. Требуется решение, которое позволит делать на лету такой UNION, чтобы в случае наличия записей в первой таблице, записи из второй таблицы не попадали в вывод в случае совпадения первичных ключей, даже в случае различия в неключевых полях. Пример ниже. Основное требование - нужно готовое решение типа промежуточной виртуальной БД с ODBC интерфейсом. Рассматривал OpenLink Virtuoso Universal Server, но пока так и не понял, как эффективно сделать такой UNION. Добавлю, что имеется более 100 таблиц, в связи с чем руками писать SQL для каждой таблицы неразумно. Уверен, что задача типовая, но на данный момент удобного решения не нашел. Буду рад любым комментариям и ссылкам. Спасибо. Зависит от БД. Например для MS SQL делать запросы к другим БД на этом же сервере. В PostgreSQL есть dblink. У Oracle что-то свое тоже есть. В зависимости от БД пишем представление или хранимую процедуру, где делаем union. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 11:52 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
Ну и пишете во второй части Union-а Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 11:54 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин, спасибо. Проблема в том, что имеются 100 таблиц с большим количеством столбцов и будет очень трудоемко для 100 таблиц делать такого рода запросы. Кроме того, такое решение будет очень медленным, так как 2 таблицы лежат на разных серверах, а доступ к ним осуществляется по только по ODBC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 12:08 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
mad_nazgul, спасибо, возьму на заметку. Но у меня только ODBC c OpenEdge Progress на другом конце. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 12:09 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
Вот что Вы хотели vitprof]Требуется решение, которое позволит делать на лету такой UNION, чтобы в случае наличия записей в первой таблице, записи из второй таблицы не попадали в вывод в случае совпадения первичных ключей, даже в случае различия в неключевых полях. Мне кажется, генерировать "на лету" запрос подобный моему по именам Table1 и Table2 - не бином Ньютона. vitprofКроме того, такое решение будет очень медленным, так как 2 таблицы лежат на разных серверах, а доступ к ним осуществляется по только по ODBC. А как Вы себе представляете НЕ "медленное" решение при таких ограничениях? Rак оно "внутри" должно работать, чтобы было быстро? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 12:46 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин А как Вы себе представляете НЕ "медленное" решение при таких ограничениях? Rак оно "внутри" должно работать, чтобы было быстро? Кот Матроскин, например, так... Виртуальная БД делает одинаковые запросы к двум БД с указанием сортировки вывода по первичному ключу. Далее, на лету выполняется соединение по строкам с учетом приоритета таблиц. Так как датасеты отсортированы, то даже не надо будет выделять много памяти на стороне виртуального сервера для выполнения такой операции. Замечу, что сортировка по первичному ключу может работать достаточно быстро, особенно, если используется кластерный индекс "для" первичного ключа на стороне сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 12:58 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
vitprofКот Матроскин А как Вы себе представляете НЕ "медленное" решение при таких ограничениях? Rак оно "внутри" должно работать, чтобы было быстро? Кот Матроскин, например, так... Виртуальная БД делает одинаковые запросы к двум БД с указанием сортировки вывода по первичному ключу. Далее, на лету выполняется соединение по строкам с учетом приоритета таблиц. Так как датасеты отсортированы, то даже не надо будет выделять много памяти на стороне виртуального сервера для выполнения такой операции. Замечу, что сортировка по первичному ключу может работать достаточно быстро, особенно, если используется кластерный индекс "для" первичного ключа на стороне сервера. "на лету выполняется" где? На сервере, на который поступил запрос? Для этого очевидно он должен получить к себе ВСЕ данные с ODBC-источников. Это организуется без проблем - скачиваете удаленные таблицы во временные (при желании - с кластерным индексом, блекджеком и прочим), дальше делаете вышеуказанный UNION уже с этими временными таблицами - это и будет Ваше "соединение по строкам". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 13:06 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин, да, все так, но: 1. Имеется 100 таблиц, для которых надо создать 100 вьюшек (написать 100 запросов) и не ошибиться 2. Я хотел бы иметь возможность к виртуальной (объединенной) таблице применять фильтры, которые виртуальный сервер теоретически мог бы применить к однотипным подзапросам, что существенно бы повысило быстродействие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 13:14 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
vitprofКот Матроскин, да, все так, но: 1. Имеется 100 таблиц, для которых надо создать 100 вьюшек (написать 100 запросов) и не ошибиться 2. Я хотел бы иметь возможность к виртуальной (объединенной) таблице применять фильтры, которые виртуальный сервер теоретически мог бы применить к однотипным подзапросам, что существенно бы повысило быстродействие. Достаточно написать один генератор таких запросов, довольно примитивный (Добавление условий туда тоже можно встроить). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 13:30 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинДостаточно написать один генератор таких запросов, довольно примитивный (Добавление условий туда тоже можно встроить). 1. Надо пользователям предоставить виртуальную БД. Фильтры будут задавать пользователи. 2. Одна из баз может меняться буквально каждую минуту. 3. Мне хотелось бы обойтись готовыми решениями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 14:02 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
vitprof1. Надо пользователям предоставить виртуальную БД. Фильтры будут задавать пользователи. 2. Одна из баз может меняться буквально каждую минуту. 3. Мне хотелось бы обойтись готовыми решениями. Можно создать не виртуальную, а реальную БД. И реплицировать в нее данные из обеих исходных баз. Правила репликации настроить так, чтобы вторая база не затирала данные 1-ой. В MSSQL 2000 мы делали похожие вещи. Для процедур репликации можно написать генератор. Или формировать третью базу триггерами из первых двух. Пользователям нужны непременно вьюшки? Они программисты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 16:22 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
vitprofТребуется решение, которое позволит делать на лету такой UNION, чтобы в случае наличия записей в первой таблице, записи из второй таблицы не попадали в вывод Если немного подумать, то окажется, что необходимое Вам решение называется не UNION, а OUTER JOIN :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2014, 18:00 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
softwarervitprofТребуется решение, которое позволит делать на лету такой UNION, чтобы в случае наличия записей в первой таблице, записи из второй таблицы не попадали в вывод Если немного подумать, то окажется, что необходимое Вам решение называется не UNION, а OUTER JOIN :) А мне кажется, что ТС нужна репликация :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 07:28 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
DirksDR, спасибо, репликация вполне может помочь. Только нет доступа к базам, есть только ODBC. Но я не буду усложнять задачу, поищу решение в этом направлении. softwarer, базы данных лежат на разных серверах, так что не уверен, что получится использовать FULL OUTER JOIN. Также не уверен, что OpenEdge Progress поддерживает такой вид объединения столбцов. Это можно было бы реализовать в промежуточной виртуальной БД, но это приведет существенному ухудшению производительности. А в случае создания вьюх придется для каждого столбца вставлять IFNULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 08:36 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
DirksDR, Пользователям нужны непременно вьюшки? Они программисты? Пользователи - не программисты, в своем большинстве используют Access, который по ODBC получает данные. Проблема в том, что изначальная БД сейчас разделяется на две БД. Одна содержит исторические данные, другая - данные за последний год, но отчеты могут использовать данные за различные периоды. Файлов Access много, менять каждый нецелесообразно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 08:46 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
vitprofЕсть две однотипных таблицы в двух разных БД. Таблица в первой БД является подмножеством (по первичному ключу) таблицы в другой БД. Требуется решение, которое позволит делать на лету такой UNION, чтобы в случае наличия записей в первой таблице, записи из второй таблицы не попадали в вывод в случае совпадения первичных ключей, даже в случае различия в неключевых полях. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 09:32 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
alexeyvg Код: sql 1. 2. 3. Читать как Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 09:33 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
vitprofDirksDR, Пользователям нужны непременно вьюшки? Они программисты? Пользователи - не программисты, в своем большинстве используют Access, который по ODBC получает данные. Проблема в том, что изначальная БД сейчас разделяется на две БД. Одна содержит исторические данные, другая - данные за последний год, но отчеты могут использовать данные за различные периоды. Файлов Access много, менять каждый нецелесообразно. Может не мучиться и купить MS SQL Server?! А так, кто мешает создать еще одну БД для отчетов со всеми данными и синхронизировать их скажем раз в сутки. Возможно все данные не нужны будут, а нужны будут только аггрегированные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 09:44 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
vitprofDirksDR, Пользователям нужны непременно вьюшки? Они программисты? Пользователи - не программисты, в своем большинстве используют Access, который по ODBC получает данные. Проблема в том, что изначальная БД сейчас разделяется на две БД. Одна содержит исторические данные, другая - данные за последний год, но отчеты могут использовать данные за различные периоды. Файлов Access много, менять каждый нецелесообразно. Может, можно две базы (и третью с вьюшками) расположить на одном сервере? Тогда бэкапить можно только базу с оперативными данными. А запросы/вьюшки, которые здесь приводились будут работать на одном сервере, быстро. Если оперативных баз и серверов много, можно продублировать архивную базу на каждом. А может партицирование нескольких таблиц исходной базы решит проблему. По какой причине принято решение разделить базу на две? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2014, 15:33 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
mad_nazgul, мне приходится работать с тем, что есть. К сожалению, я не занимаюсь закупками БД. В больших компаниях это сделать не так просто. Что касается создания отдельной БД и синхронизировать данные, то конечно это можно сделать, но трудозатратно, так как много данных и таблиц (300Gb). Надо делать полноценное хранилище данных, которое пока в разработке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2014, 10:45 |
|
||
|
объединение типа UNION таблиц с учетом их приоритета
|
|||
|---|---|---|---|
|
#18+
DirksDR, одна база используется ERP системой. Сейчас она сильно разрослась и требуется очистка. Исторические данные планируется вынести в отдельную БД. Я прояснил момент по поводу настройки реплики - в случае OpenEdge Progress, к сожалению, не получится настроить реплику из двух разных БД. Скорее всего придется вьюхи генерировать и создавать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2014, 10:52 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=28&tid=1540851]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 148ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...