Как объединить базу данных sql с delphi
Перейти к содержимому

Как объединить базу данных sql с delphi

  • автор:

Как объединить базу данных sql с delphi

Приветствую гуру SQL !
Когда то год назад в интернете я точно видел такой запрос, но сегодня не могу его найти. Вроди запрос даже вёл на наш форум.
Вообщем суть
У меня есть 2 таблицы, вот такие

SELECT * FROM table1 A LEFT OUTER JOIN table2 B ON B.id=A.id AND B.label=A.label WHERE A.label=1

даёт вот такой результат

а нужен вот такой

как «доточить» пустые данные крайней заполненной выборкой ?

95% сбоев и ошибок приложений, находится в полу метрах от монитора
Последний раз редактировалось JUDAS; 06.11.2017 в 10:41 .
Регистрация: 17.11.2010
Сообщений: 19,042
Сам же недавно и спрашивал ))
http://www.programmersforum.ru/showthread.php?t=310682

Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

фонатик DELPHI
Форумчанин
Регистрация: 14.01.2008
Сообщений: 714
Сообщение от Аватар
Сам же недавно и спрашивал ))

неее, то совсем другая задача. там одна таблица и несколько подчинённых и нужно было подставить то или иное значение в завовимсоти от наличия записи в подчинённой таблице. то есть типо

Есть таблица «транспортные средства» и есть таблицы «грузовые» (со своими типами) «легковые» (со своими) «мотоциклы» )со своими) и.т.п.
Нужно выбрать все транспортные средства с указанием объединёного типа

А тут всё по другому
Есть непрерывные посылки которые принимаюся ежесекундно , парсятся и записываются в базу данных. Каждый набор «посылок» принимается в определённом диапозоне времени (например с 10.00 до 10.45). Во время приёма этих посылок, проскакивают посылки другого типа (асинхронно), которые меняют какой то параметр основного потока.. таких посылок может прийти несколько десятков штук, может сотня, а может только одна!
Так вот. Нужно выборку общего потока данных с JOIN-ом этих посылок причём чтобы в каждую секунду(каждый принятый пакет) был сопоставлен с самим крайним изменением в потоке

95% сбоев и ошибок приложений, находится в полу метрах от монитора
Регистрация: 17.11.2010
Сообщений: 19,042
Не понял зачем Table0. А так, если правильно понял, определить вот такой максимум

SELECT A.id,A.label,A.param1,A.param2,B.id id2,B.label label2,B.param1 param12,B.param2 param22, (SELECT MAX(T.id) FROM Table2 T WHERE T.id

и используя как вложенній запрос получить

SELECT U.id,U.label,U.param1,U.param2, CASE WHEN U.id2 IS NULL THEN V.id ELSE U.id2 END AS id2, CASE WHEN U.id2 IS NULL THEN V.label ELSE U.label2 END AS label2, CASE WHEN U.id2 IS NULL THEN V.param1 ELSE U.param12 END AS param12, CASE WHEN U.id2 IS NULL THEN V.param2 ELSE U.param22 END AS param22 FROM ( SELECT A.id,A.label,A.param1,A.param2,B.id id2,B.label label2,B.param1 param12,B.param2 param22, (SELECT MAX(T.id) FROM Table2 T WHERE T.id

Можно isnull вместо кейсов, или coalesce, кажись есть в Postgres

Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.11.2017 в 19:42 .
фонатик DELPHI
Форумчанин
Регистрация: 14.01.2008
Сообщений: 714

Огромное тебе спасибо Аватар.
Ты в очередной раз помог мне =)

Очень жаль что движок не даёт тебе плюсануть ответ

Не понял зачем Table0.

Table0 - таблица с параметрами рейсов
Table1 - таблица с изменяющейся метрикой рейса (каждые 4 секунды 1 запись с новыми координатами и скоростью)
Table2 - таблица параметров которые меняются с меньшей частотой , например смена высоты, переход в разные районы и.т.п

Структура которая показана выше, позволяет сильно! уменьшить размеры БД изза того, что пустые поля Table2 не дублируются в Table1 миллионы раз
Но чтобы такая структура ожила, нужен был тот самый скрип который ты написал. Используя его создаётся некая ВЬЮШКА в которой
можно будет выбирать и проигрывать историю за период

кстати, id - на самом деле moment (время в формате целого числа UNIX) а label - airtcraft_id идентификатор главной записи в Table0 которая содержит много полей
начиная от аэродромов вылета/посадки заканчивая типом самолёта, его регистрационными кодами разными а так же туда дублируется крайняя метрика
чтобы можно было проигрывать в режиме realtime не залезая в Table1 и Table2 которые на два-три порядка больше по размеру чем Table0

95% сбоев и ошибок приложений, находится в полу метрах от монитора
Последний раз редактировалось JUDAS; 06.11.2017 в 10:48 .

Пример подключения базы данных Microsoft Access к приложению

Дана база данных, сформированная средствами СУБД Microsoft Access. База данных расположена на диске по такому пути:

Структура базы данных и связи между таблицами изображены на рисунке 1.

01_02_00_008_01

Рис. 1. Схема связей между таблицами базы данных

Необходимо осуществить подключение данной базы данных к приложению Windows.

Выполнение

1. Запустить Delphi

Пример создания и сохранения приложения в Delphi подробно описывается здесь.

Создать форму и сохранить проект под произвольным именем.

2. Компоненты для работы с базой данных

Из вкладки « dbGo » палитры инструментов выбираем компоненты TADOConnection и TADOTable .
Из вкладки « Data Access » выбираем компонент TDataSource (рис. 2).
Выносим эти компоненты на форму приложения.

01_02_00_008_02_

Рис. 2. Компоненты для соединения с базой данных

Компоненты из палитры «dbGo» предназначены для работы с базами данных по технологии ADO , которая хорошо подходит для базы данных Microsoft Access.

Вместо компонента TADOQuery можно использовать компонент TADOTable . Можно также совмещать эти компоненты.

С целью визуализации данных из таблиц используется компонент TDBGrid из палитры Data Controls . Он отображает данные в некоторой таблице базы данных. После выноса этого компонента на форму, вид окна проектирования примет приблизительно следующий вид (рис. 3).

01_02_00_008_03_

Рис. 3. Компонент DBGrid1 для отображения данных из базы данных

3. Настройка компонент

Существует два варианта подключения к базе данных с использованием вышеупомянутых компонент (рис. 4).

01_02_00_008_04r

Рис. 4. Способы подключения к файлу базы данных

Во втором случае подключение осуществляется через дополнительный компонент ADOConnection1 . Этот способ есть более обобщенным случаем и лучше подходит для случаев, когда несколько компонент типа TADOTable или TADOQuery используются для доступа к одному соединению ADOConnection1 .

Выбираем второй способ настройки.

4. Строка соединения ConnectionString

Для доступа к файлу базы данных нужно задать путь к этому файлу и установить другие параметры.

Осуществим настройку свойства ConnectionString компонента ADOConnection1 . Таким же образом настраивается свойство ConnectionString компонента ADOTable1 .

Сначала выделим компонент ADOConnection1 . В Object Inspector выбирается свойство ConnectionString (рис. 5).

01_02_00_008_05_

Рис. 5. Свойство ConnectionString компонента ADOConnection1

В результате откроется окно « Form1.ADOConnection1 ConnectionString » (рис. 6).

Предлагается 2 варианта подключения:

  • Use Data Link File ;
  • Use Connection String .

В первом случае есть возможность подключения к базе данных путем выбора файлов типа Microsoft Data Link с расширением « *.udl «. Эти файлы служат для связи с данными по технологии ADO .

Для ознакомления используем второй способ « Use Connection String «. Выбираем кнопку « Build… «.

01_02_00_008_06_

Рис. 6. Способы выбора источника соединения

В результате предыдущего выбора откроется окно « Свойства связи с данными » (рис. 7).

01_02_00_008_07_

Рис. 7. Окно «Свойства связи с данными»

В этом окне выбираем поставщика OLE DB . Для работы с базами данных Microsoft Access лучше всего подходит поставщик « Microsoft Jet 4.0 OLE DB Provider «.

Делаем клик на кнопке « Далее >> «.

На следующем этапе нужно выбрать файл базы данных (рис. 8). Согласно с условием задания файл базы данных размещается по следующему пути:

Кликаем на кнопке « » и выбираем файл базы данных.

01_02_00_008_08_

Рис. 8. Вкладка «Подключение» с выбранным файлом базы данных

Есть возможность протестировать подключение кнопкой « Проверить подключение «. Если все в порядке, то будет выведено следующее сообщение (рис. 9).

01_02_00_008_09_

Рис. 9. Тестирование подключения к файлу базы данных

После этого выбираем « ОК «. Окно « Form1.ADOConnection1 ConnectionString » имеет вид (рис. 10).

01_02_00_008_10_

Рис. 10. Окно « Form1.ADOConnection1 ConnectionString »
с выбранным источником соединения

В окне на рисунке 10 выбираем « ОК «. После этого свойство ConnectionString компонента ADOConnection1 будет сформировано.

5. Свойство LoginPrompt компонента ADOConnection1

По умолчанию, база данных настроена таким образом, что при обращении к данным от пользователя будет требоваться ввести имя и пароль. Во избежание неудобств, необходимо в свойстве LoginPrompt компонента ADOConnection1 установить значение «false» (рис. 11).

01_02_00_008_11_

Рис. 11. Свойство LoginPrompt компонента ADOConnection1

6. Связывание компонент между собой

Теперь можно связать компоненты между собой по схеме, изображенной на рис. 4 а).
Для этого, используя Object Inspector , необходимо выполнить следующие действия:

  • в компоненте ADOTable1 свойство Connection нужно установить в значение ADOConnection1 ;
  • в компоненте DataSource1 свойство DataSet установить в значение ADOTable1 ;
  • в компоненте DBGrid1 свойство DataSource установить в значение DataSource1 .
7. Выбор таблицы Students и ее отображение

После выполненных операций имеем связь приложения с базой данных.

Теперь нужно задать таблицу или запрос для вывода в DBGrid1 .
Если использовать компонент TADOQuery , то для вывода используется строка запроса на языке SQL . В этом случае данные в DBGrid1 могут отображаться сразу из нескольких таблиц.

Если используется компонент TADOTable (наш случай), то выводится непосредственно одна из таблиц базы данных.

Выберем для примера таблицу Students .

Для этого с помощью Object Inspector в компоненте ADOTable1 нужно:

  • в свойстве «TableName» выбрать таблицу Students ;
  • свойство Active установить в значение «true» .

В результате выполненных действий данные сразу отобразятся в компоненте DBGrid1 (рис. 12).

01_02_00_008_12_

Рис. 12. Настройка ADOTable1 и вывод таблицы Students

Задача решена!

Как объединить базу данных sql с delphi

Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля. Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Модераторы: Bas, Rouse_

'> Объединение таблиц из разных баз данных Interbase , Как объединить однотипные таблицы из разных баз данных

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему

Сообщ. #1 , 18.03.11, 11:40
Unregistered

Всем привет!
Имеется три магазина в разных городах. В этих же магазинах расположены по одной базе данных. Нужно подключиться к каждой из этих баз, сделать запрос на выборку остатков товара и объединить всё в одной таблице (DBGrid). Во всех базах коды товара могут совпадать.
Должна получиться таблица такого вида:

|Код товара| Наименование | Город1 | Город2 | Город3 |
|23424 | Утюг | 3 | 2 | 0 |
|4342 | Чайник | 10 | 2 | 5 |

Т.е. чтобы не было дубликатов по коду товара, если коды товара совпадают, то они должны идти одной строкой.

Я никак не пойму, каким образом сделать подключение сразу к трём базами и одним запросом объединить в одну таблицу.

Сообщ. #2 , 18.03.11, 13:45

Рейтинг (т): 110
Сразу к трем? А поочереди?
Сообщ. #3 , 19.03.11, 05:01
Unregistered
Цитата Anatoly Podgoretsky @ 18.03.11, 13:45
Сразу к трем? А поочереди?

Можно и поочереди, главное чтобы данные со всех трёх баз были в одной таблице (DBGrid).
Т.е. это однократное подключение с выборкой данных и объединение в одной таблице.
IBQuery работает только с тем компонентом (IBConnection) который в нём прописан, если было бы возможно прилинковать сразу несколько IBConnection, проблем бы не было.
Ведь кто-то наверняка сталкивался с данным вопросом, помогите.

Сообщ. #4 , 21.03.11, 05:39
Рейтинг (т): -1

Надо подключаться через TIDDATABASE
Все пути держать в текстовом файле загружать его в мемо
и в цикле подключаешь базы

TIDDATABASE .Connected:=false;
TIDDATABASE .DatabaseName:=fpolufab.memo1.Lines.Strings[0];
TIDDATABASE .Connected:=true;

Сбрасываешь сначала все данные не разбираясь в общею таблицу

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

Сообщ. #5 , 21.03.11, 07:47
Рейтинг (т): 3
Цитата Discovery @ 21.03.11, 05:39

Надо подключаться через TIDDATABASE
Все пути держать в текстовом файле загружать его в мемо
и в цикле подключаешь базы

TIDDATABASE .Connected:=false;
TIDDATABASE .DatabaseName:=fpolufab.memo1.Lines.Strings[0];
TIDDATABASE .Connected:=true;

Сбрасываешь сначала все данные не разбираясь в общею таблицу

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

Вот готов с каждым предложением поспорить. Буквально. Либо ерунда, либо вообще глупость.
Сообщ. #6 , 21.03.11, 07:54
Рейтинг (т): 127

Одним запросом вроде не получится - SQL, емнип, не позволяет делать кросс-БД запросы.
Варианты:
1) Создать в локальной БД три временные таблицы, в них скопировать через "SELECT *" все удаленные данные, потом одним запросом объединить в нужную таблицу
2) а) В query полностью скопировать всё из первой таблицы-источника
б) Объединить c данными из второй таблицы-источника
в) Объединить c данными из третьей таблицы-источника
г) Перенести в таблицу назначения

Более конкретно сказать сложно, т.к. непонятен принцип объединения

Цитата Maximus555 @ 18.03.11, 11:40

Т.е. чтобы не было дубликатов по коду товара, если коды товара совпадают, то они должны идти одной строкой

Сообщение отредактировано: Fr0sT - 21.03.11, 07:55
Сообщ. #7 , 21.03.11, 07:55
Unregistered
Цитата Discovery @ 21.03.11, 05:39

Надо подключаться через TIDDATABASE
Все пути держать в текстовом файле загружать его в мемо
и в цикле подключаешь базы

TIDDATABASE .Connected:=false;
TIDDATABASE .DatabaseName:=fpolufab.memo1.Lines.Strings[0];
TIDDATABASE .Connected:=true;

Сбрасываешь сначала все данные не разбираясь в общею таблицу

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

Вот именно таким образом и не хочется делать. Т.к. очень много манипуляций и ожидание по времени прежде чем отобразить готовую таблицу.

Добавлено 21.03.11, 07:58

Цитата Fr0sT @ 21.03.11, 07:54

Одним запросом вроде не получится - SQL, емнип, не позволяет делать кросс-БД запросы.
Варианты:
1) Создать в локальной БД три временные таблицы, в них скопировать через "SELECT *" все удаленные данные, потом одним запросом объединить в нужную таблицу
2) а) В query полностью скопировать всё из первой таблицы-источника
б) Объединить c данными из второй таблицы-источника
в) Объединить c данными из третьей таблицы-источника
г) Перенести в таблицу назначения

Более конкретно сказать сложно, т.к. непонятен принцип объединения

Цитата Maximus555 @ 18.03.11, 11:40

Т.е. чтобы не было дубликатов по коду товара, если коды товара совпадают, то они должны идти одной строкой

Как объединить на форме несколько баз данных?

Как объединить несколько баз данных под одним, имя которому "МастерБД"?
Как обьеденить несколко баз данных под одним, имя которому "МастерБД". Предполойим у меня ест.

Django несколько баз данных и несколько приложений в проекте
Здравствуйте всем! По данному вопросу есть офф.документация и много других ссылок на эту тему, но.

C# и несколько баз данных
как можно подключится одновременно к нескольким базам данных на sql? Структура баз данных.

Silvrelight, wcf и несколько баз данных
Здравствуйте, Вкратце ситуация: есть статичная база данных и динамически создаваемые базы данных.

5650 / 4413 / 1408
Регистрация: 14.04.2014
Сообщений: 19,757
Записей в блоге: 20

не задавайте вопросы "вообще"
для ответа на вообще есть учебники
если есть конкретный вопрос - задавайте
сценарий идеального вопроса

1. нужно получить такое
2. в наличии вот это
3. пробовал вот это
4. должно было быть так
5. а получилось вот так

9025 / 5826 / 2330
Регистрация: 21.01.2014
Сообщений: 24,931
Записей в блоге: 3

ЦитатаСообщение от QwErTy2002 Посмотреть сообщение

объединить на форме несколько баз данных?
Это у меня температура или Вы что-то гоните.
560 / 229 / 88
Регистрация: 11.07.2015
Сообщений: 817
Обьединить можно в запросе

. INNER JOIN путь к базе.Таблица. 

1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790

UR1004SWL, вопрос читайте внимательно. Приведенная часть запроса - это из объединения данных из разных таблиц ОДНОЙ базы данных.
ТС, однако спрашивает об объединении баз данных. Может ему надо репликацию двух или больше баз делать.
Правильно krapotkin, пишет. Вопросы надо задавать более конкретно и развернуто. Только тогда есть реальный шанс получить нужный ответ.

4214 / 3054 / 582
Регистрация: 21.01.2011
Сообщений: 13,205

ЦитатаСообщение от QwErTy2002 Посмотреть сообщение

Как объединить на форме несколько баз данных?

На всякий - понятие базы данных в разных СУБД отличается. Скажем в dbf (например, Clipper) БД - это отдельный файл, в котором находится одна таблица (м.б. еще файлы индексов). В Oracle БД - это все файлы, которые содержат всю инфу данной БД (таблицы, индексы, хранимые процедуры и проч).
Поэтому для начала дай определение БД (как ты это понимаешь).

560 / 229 / 88
Регистрация: 11.07.2015
Сообщений: 817

ЦитатаСообщение от Скандербег Посмотреть сообщение

вопрос читайте внимательно. Приведенная часть запроса - это из объединения данных из разных таблиц ОДНОЙ базы данных.

Может так будет понятнее

. FROM одна база. INNER JOIN Путь к другой базе.Таблица. 

1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790

ЦитатаСообщение от UR1004SWL Посмотреть сообщение

Может так будет понятнее

Да, как-то не получается.
Похожий (только похожий и он под сомнением) запрос можно, конечно, применить к десктопной БД, где каждая таблица сидит в отдельном файле, но если СУБД достаточно серьезная, то две или более баз этот запрос "не потянет". Просто потому, что к каждой базе должны быть в отдельных компонентах свои собственные соединения.
Поэтому, пока не будет конкретики в вопросе ТС, ничего сказать невозможно.

4214 / 3054 / 582
Регистрация: 21.01.2011
Сообщений: 13,205

ЦитатаСообщение от Скандербег Посмотреть сообщение

то две или более баз этот запрос "не потянет"

Не совсем. Скажем, в Oracle есть понятие dblink, которым можно объединить 2 БД. В этом случае клиент, подключившись к базе1 может, в том числе, читать данные из другой базы.
Это запрос к БД, к которой клиент подключился

SELECT * FROM tab1

Это запрос к БД через dblink

SELECT * FROM tab1@db2 -- db2 - имя dblink

И использование их в одном запросе совсем не запрещено.
560 / 229 / 88
Регистрация: 11.07.2015
Сообщений: 817

ЦитатаСообщение от Скандербег Посмотреть сообщение

Похожий (только похожий и он под сомнением) запрос можно, конечно

Обьединение двух разных баз (папка Base) в запросе. Есть более серьёзный перекрёстный запрос на вывод статистических данных из двух баз. С тремя и более не скажу, не сталкивался.

Вложения

Base.rar (2.09 Мб, 13 просмотров)

1074 / 987 / 340
Регистрация: 07.08.2012
Сообщений: 2,790

Понятно, что пример сделан быстро ("на коленке").
Но сразу два вопроса.
- Как можно распределить ссылочные идентификаторы по двум базам (в примере то с этим всё тип-топ, т.к. идентификаторы просто совпадают). Но, скорее всего, дело это не простое, а потому вряд ли кому нужное.
- На примере Аксесса да, получилось, а как быть с базами, к примеру MS SQL Server, Interbase, SQLite и прочих? Проверять надо.

Видимо, здесь не дождутся ответов ТС.
Поэтому можно дискуссию закрывать за ненадобностью объединения данных по join из разных баз в реальной жизни.
Репликация, да, это нужно и актуально, но не JOIN (упаси Господи).

Да и вообще, такое впечатление, что автор темы просто ошибся, назвав базами данных обычные таблицы из базы.

560 / 229 / 88
Регистрация: 11.07.2015
Сообщений: 817

ЦитатаСообщение от Скандербег Посмотреть сообщение

Как можно распределить ссылочные идентификаторы по двум базам (в примере то с этим всё тип-топ, т.к. идентификаторы просто совпадают). Но, скорее всего, дело это не простое, а потому вряд ли кому нужное.

Мне нужно, вот ищу пути решения, но пока ноль, но знаю одну программу, где обращение к базам идёт именно по идентификатору, но спросить у автора уже нет возможности, пять лет, как умер.

884 / 586 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1

Я вот не понимаю формулировку "объединить". Тем более "объединить на форме".

Добавлено через 38 секунд
Какая СУБД? У баз одинаковые СУБД? Обе базы на одной СУБД или на разных?

Добавлено через 44 секунды
Требуется получить данные из этих двух БД по отдельности или чтоб в одной выборке?

Добавлено через 2 минуты
Если что, на MS SQL Server можно так:

1 2 3
SELECT * FROM [some_db].[dbo].[some_table] UNION ALL SELECT * FROM [another_db].[dbo].[similar_table]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *