powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / объединение типа UNION таблиц с учетом их приоритета
22 сообщений из 22, страница 1 из 1
объединение типа UNION таблиц с учетом их приоритета
    #38685568
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, добрый день

Есть две однотипных таблицы в двух разных БД. Таблица в первой БД является подмножеством (по первичному ключу) таблицы в другой БД. Требуется решение, которое позволит делать на лету такой 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.
ID   Date
------------
1    1/1/2014   (из таблицы A)
2    2/1/2014   (из таблицы A)
3    3/1/2014   (из таблицы A)
4    1/2/2014   (из таблицы B)
5    8/1/2014   (из таблицы A)

...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685585
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofКоллеги, добрый день

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

Основное требование - нужно готовое решение типа промежуточной виртуальной БД с ODBC интерфейсом. Рассматривал OpenLink Virtuoso Universal Server, но пока так и не понял, как эффективно сделать такой UNION. Добавлю, что имеется более 100 таблиц, в связи с чем руками писать SQL для каждой таблицы неразумно.

Уверен, что задача типовая, но на данный момент удобного решения не нашел. Буду рад любым комментариям и ссылкам. Спасибо.


Зависит от БД.
Например для MS SQL делать запросы к другим БД на этом же сервере.
В PostgreSQL есть dblink.
У Oracle что-то свое тоже есть.

В зависимости от БД пишем представление или хранимую процедуру, где делаем union.
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685590
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и пишете во второй части Union-а
Код: sql
1.
2.
3.
select *
from table2
WHERE    Not exists (select  *  from table1 where table1.KeyField = table2.KeyField)
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685603
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин, спасибо. Проблема в том, что имеются 100 таблиц с большим количеством столбцов и будет очень трудоемко для 100 таблиц делать такого рода запросы. Кроме того, такое решение будет очень медленным, так как 2 таблицы лежат на разных серверах, а доступ к ним осуществляется по только по ODBC.
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685605
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgul, спасибо, возьму на заметку. Но у меня только ODBC c OpenEdge Progress на другом конце.
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685646
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что Вы хотели
vitprof]Требуется решение, которое позволит делать на лету такой UNION, чтобы в случае наличия записей в первой таблице, записи из второй таблицы не попадали в вывод в случае совпадения первичных ключей, даже в случае различия в неключевых полях.
Мне кажется, генерировать "на лету" запрос подобный моему по именам Table1 и Table2 - не бином Ньютона.

vitprofКроме того, такое решение будет очень медленным, так как 2 таблицы лежат на разных серверах, а доступ к ним осуществляется по только по ODBC.
А как Вы себе представляете НЕ "медленное" решение при таких ограничениях? Rак оно "внутри" должно работать, чтобы было быстро?
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685662
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин А как Вы себе представляете НЕ "медленное" решение при таких ограничениях? Rак оно "внутри" должно работать, чтобы было быстро?

Кот Матроскин, например, так... Виртуальная БД делает одинаковые запросы к двум БД с указанием сортировки вывода по первичному ключу. Далее, на лету выполняется соединение по строкам с учетом приоритета таблиц. Так как датасеты отсортированы, то даже не надо будет выделять много памяти на стороне виртуального сервера для выполнения такой операции. Замечу, что сортировка по первичному ключу может работать достаточно быстро, особенно, если используется кластерный индекс "для" первичного ключа на стороне сервера.
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685683
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofКот Матроскин А как Вы себе представляете НЕ "медленное" решение при таких ограничениях? Rак оно "внутри" должно работать, чтобы было быстро?

Кот Матроскин, например, так... Виртуальная БД делает одинаковые запросы к двум БД с указанием сортировки вывода по первичному ключу. Далее, на лету выполняется соединение по строкам с учетом приоритета таблиц. Так как датасеты отсортированы, то даже не надо будет выделять много памяти на стороне виртуального сервера для выполнения такой операции. Замечу, что сортировка по первичному ключу может работать достаточно быстро, особенно, если используется кластерный индекс "для" первичного ключа на стороне сервера.

"на лету выполняется" где? На сервере, на который поступил запрос? Для этого очевидно он должен получить к себе ВСЕ данные с ODBC-источников.
Это организуется без проблем - скачиваете удаленные таблицы во временные (при желании - с кластерным индексом, блекджеком и прочим), дальше делаете вышеуказанный UNION уже с этими временными таблицами - это и будет Ваше "соединение по строкам".
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685697
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин, да, все так, но:

1. Имеется 100 таблиц, для которых надо создать 100 вьюшек (написать 100 запросов) и не ошибиться
2. Я хотел бы иметь возможность к виртуальной (объединенной) таблице применять фильтры, которые виртуальный сервер теоретически мог бы применить к однотипным подзапросам, что существенно бы повысило быстродействие.
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685710
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofКот Матроскин, да, все так, но:

1. Имеется 100 таблиц, для которых надо создать 100 вьюшек (написать 100 запросов) и не ошибиться
2. Я хотел бы иметь возможность к виртуальной (объединенной) таблице применять фильтры, которые виртуальный сервер теоретически мог бы применить к однотипным подзапросам, что существенно бы повысило быстродействие.

Достаточно написать один генератор таких запросов, довольно примитивный (Добавление условий туда тоже можно встроить).
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685759
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот МатроскинДостаточно написать один генератор таких запросов, довольно примитивный (Добавление условий туда тоже можно встроить).

1. Надо пользователям предоставить виртуальную БД. Фильтры будут задавать пользователи.
2. Одна из баз может меняться буквально каждую минуту.
3. Мне хотелось бы обойтись готовыми решениями.
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38685960
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprof1. Надо пользователям предоставить виртуальную БД. Фильтры будут задавать пользователи.
2. Одна из баз может меняться буквально каждую минуту.
3. Мне хотелось бы обойтись готовыми решениями.
Можно создать не виртуальную, а реальную БД.
И реплицировать в нее данные из обеих исходных баз.
Правила репликации настроить так, чтобы вторая база не затирала данные 1-ой.
В MSSQL 2000 мы делали похожие вещи. Для процедур репликации можно написать генератор.

Или формировать третью базу триггерами из первых двух.

Пользователям нужны непременно вьюшки? Они программисты?
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38686077
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofТребуется решение, которое позволит делать на лету такой UNION, чтобы в случае наличия записей в первой таблице, записи из второй таблицы не попадали в вывод
Если немного подумать, то окажется, что необходимое Вам решение называется не UNION, а OUTER JOIN :)
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38686380
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarervitprofТребуется решение, которое позволит делать на лету такой UNION, чтобы в случае наличия записей в первой таблице, записи из второй таблицы не попадали в вывод
Если немного подумать, то окажется, что необходимое Вам решение называется не UNION, а OUTER JOIN :)

А мне кажется, что ТС нужна репликация :-)
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38686396
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DirksDR, спасибо, репликация вполне может помочь. Только нет доступа к базам, есть только ODBC. Но я не буду усложнять задачу, поищу решение в этом направлении.

softwarer, базы данных лежат на разных серверах, так что не уверен, что получится использовать FULL OUTER JOIN. Также не уверен, что OpenEdge Progress поддерживает такой вид объединения столбцов. Это можно было бы реализовать в промежуточной виртуальной БД, но это приведет существенному ухудшению производительности. А в случае создания вьюх придется для каждого столбца вставлять IFNULL.
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38686402
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DirksDR, Пользователям нужны непременно вьюшки? Они программисты?

Пользователи - не программисты, в своем большинстве используют Access, который по ODBC получает данные. Проблема в том, что изначальная БД сейчас разделяется на две БД. Одна содержит исторические данные, другая - данные за последний год, но отчеты могут использовать данные за различные периоды. Файлов Access много, менять каждый нецелесообразно.
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38686429
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofЕсть две однотипных таблицы в двух разных БД. Таблица в первой БД является подмножеством (по первичному ключу) таблицы в другой БД. Требуется решение, которое позволит делать на лету такой UNION, чтобы в случае наличия записей в первой таблице, записи из второй таблицы не попадали в вывод в случае совпадения первичных ключей, даже в случае различия в неключевых полях.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select t.id, t.date
from (
	select t.*, ROW_NUMBER() over(partition by t.id order by t.src) as num
	from (
		select 't1' as src, id, date from t1
		union all
		select 't2' as src, id, date from t1
		...
	) as t
) as t
where t.num = 1
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38686432
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Код: sql
1.
2.
3.
select 't1' as src, id, date from t1
union all
select 't2' as src, id, date from t1


Читать как
Код: sql
1.
2.
3.
select 't1' as src, id, date from t1
union all
select 't2' as src, id, date from t2
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38686447
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofDirksDR, Пользователям нужны непременно вьюшки? Они программисты?

Пользователи - не программисты, в своем большинстве используют Access, который по ODBC получает данные. Проблема в том, что изначальная БД сейчас разделяется на две БД. Одна содержит исторические данные, другая - данные за последний год, но отчеты могут использовать данные за различные периоды. Файлов Access много, менять каждый нецелесообразно.

Может не мучиться и купить MS SQL Server?!

А так, кто мешает создать еще одну БД для отчетов со всеми данными и синхронизировать их скажем раз в сутки.
Возможно все данные не нужны будут, а нужны будут только аггрегированные данные.
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38686953
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vitprofDirksDR, Пользователям нужны непременно вьюшки? Они программисты?

Пользователи - не программисты, в своем большинстве используют Access, который по ODBC получает данные. Проблема в том, что изначальная БД сейчас разделяется на две БД. Одна содержит исторические данные, другая - данные за последний год, но отчеты могут использовать данные за различные периоды. Файлов Access много, менять каждый нецелесообразно.
Может, можно две базы (и третью с вьюшками) расположить на одном сервере?
Тогда бэкапить можно только базу с оперативными данными.
А запросы/вьюшки, которые здесь приводились будут работать на одном сервере, быстро.
Если оперативных баз и серверов много, можно продублировать архивную базу на каждом.

А может партицирование нескольких таблиц исходной базы решит проблему.

По какой причине принято решение разделить базу на две?
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38687593
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgul, мне приходится работать с тем, что есть. К сожалению, я не занимаюсь закупками БД. В больших компаниях это сделать не так просто. Что касается создания отдельной БД и синхронизировать данные, то конечно это можно сделать, но трудозатратно, так как много данных и таблиц (300Gb). Надо делать полноценное хранилище данных, которое пока в разработке.
...
Рейтинг: 0 / 0
объединение типа UNION таблиц с учетом их приоритета
    #38687608
vitprof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DirksDR, одна база используется ERP системой. Сейчас она сильно разрослась и требуется очистка. Исторические данные планируется вынести в отдельную БД. Я прояснил момент по поводу настройки реплики - в случае OpenEdge Progress, к сожалению, не получится настроить реплику из двух разных БД. Скорее всего придется вьюхи генерировать и создавать.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / объединение типа UNION таблиц с учетом их приоритета
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]