Репликация, синхронизация от две бази данни, например на Firebird, разнородни заявки

Имаме една програма, със свързани бази данни, да кажем две от различни IP адреси. И тогава се натъкнах на проблем. От Delphi не мога да направя заявка, сравняваща две таблици от различни бази данни. Отписах се от форумите, отговорът беше тъп, невъзможен или по трудни начини, но исках да го направя вече на намерените примери. Ето един въпрос във форума.

Има две различни бази данни (връзка в една и съща програма, към различни IP адреси) чрез изпълнението на FIB компонентите (FIBDatabase) в Delphi. Необходимо е да се сравнят две таблици в полета, идентични по структура. Опитвайки се да направя нещо подобно; ПРИМЕРизберете x1.fld от таблица x1, където не СЪЩЕСТВУВА (изберете x2.fld от таблица x2, където x2.fld=x1.fld ) - изберете записи, които не съвпадат.

но с pfibdataset не мога да посоча втората таблица в друга база данни, имената на таблиците са същите. и не може да продължи DM.efSDS.SelectSQL.Clear; DM.efSDS.SelectSQL.Add('SELECT X1.fld FROM X1 WHERE. ');

Видях и това във форума ПРИМЕР:SELECT a.fld1, a.fld2 FROM db1.table1 a, db2.table1 b WHERE a. > и не знам как да го направя.

Ясно всичко, когато две таблици в една база. Как мога да се позова на друга таблица в различна база данни (свързана в различна FIBDatabase, fibdataset ) със същото име в кода на заявката, не мога да разбера как на практика да приложа това. И изведете както искате, да речем DBGrid. Може ли някой да ми каже как да внедря това в Delphi, примери.

По принцип получих два отговора: 1. По някакъв начин чрез BDE 2. Това е разнородна заявка, дори не знам какво е, не е приложимо във Firebird (някой пише, може би е възможно във Firebird 3.0). Имаше отговори на прехода към платени бази и възможността да се правят разнородни заявки в Oracle. Тогава стана ясно, натъкнах се на камъни, всичко не е просто.

Имаше отговор, да се направят две различни заявки за всяка таблица и да се сравнят,почти ред по ред. Логично вероятно изглежда нещо подобно

Е, със 100 записа всичко беше лесно, а базата данни е голяма. Изглежда, че е задънена улица. И мислите се връщат към идеята в началото на статията, отделна сравнителна таблица или добавка. поле. Всички тези сложни бъркотии и търсения на готова опция или query команди, някакво изброяване на записи и т.н. - всичко не пасва. И тогава интернет не помогна!. Ще се прави по съветски принцип, мисля, че бързо ще стане.

Персонално решение, което надхвърля Firebird:

2. За бързо прехвърляне към база A (главна), трябва да има място, където да запишем последния сериен идентификатор от бази B, C, които сме прехвърлили. С течение на времето се появяват нови данни на бази B, C, ID се увеличава. Уточняваме кои са най-новите на B, C, където сме се спрели на A и копираме новите данни. Проблемът остава как да разпознаем различни бази B, C, кой кой е - това не е проблем, просто създайте отличителни етикети някъде в базата данни.

3. Оказва се за обслужване на полето data_edit, фиксиране на последния идентификатор при прехвърляне от други бази B, C. За надеждност и яснота добавяме към базата И още две полета във всички таблици са основният източник ID от други бази (да речем ID_primary) и полето за етикет от коя база на добавянето (base_primary),

4. Остава да се актуализира базата данни А, когато няма нови записи, но има редактиране. Тук ще ни помогне полето data_edit, което създадохме и бързото му локализиране в друга база данни от полето ID_primary, а base_primary - ще покаже дали ние сме отговаряли тук. Имайки дати на промяна, можете бързо да проследявате само променените данни, а не да управлявате всички бази данни от 1 запис до безкрайност.

Решението ще изглежда сложно, но логично много бързо с мъртъв интернет в база А. Остава да го приложим.

5. Създаваме програма или бутон, който сам по себе сисъбира имена на таблици, поставя нови етикети, създава нови полета в тези, посочени в параграфи 1-4 по-горе, без да избирате всичко с ръцете си (в процес на разработка).

ВМЪКНЕТЕ ВЪВ ВАЛУТА (ID, ISO_LAT, ИМЕ, ISSHOW, HTMLCODE, RCODE) СТОЙНОСТИ (840, 'USD', 'Щатски долари', 'Y', '$', 'R01235'); ВМЪКНЕТЕ ВЪВ ВАЛУТА (ID, ISO_LAT, ИМЕ, ISSHOW, HTMLCODE, RCODE) СТОЙНОСТИ (810 , 'RUR' , 'руски рубли', 'Y', 'R', NULL);

От форума сравнение и смяна МИНУС

Имам две еднакви заявки с различен филтър, приложен къмедна и съща таблица. първата заявка връща (1,2,3,4,5), а втората връща (3,4,5).

Искам да приложа оператора MINUS/EXCEPT: select1 минus select2 = (1,2)

Как трябва да внедря тази логика с помощта на SQL диалекта на firebird? (Използвам суперсървър v2.1)

Получавам противоположни резултати, изпълнявайки select1 UNION select2 = (1,2,3,4,5)

Във FB няма оператор минус, така че:

Операторът MINUS не съществува във Firebird. Най-близкото приближение, за което се сещам, е нещо като примера по-долу. Това използва общи таблични изрази, въведени във Firebird 2.1, но разбира се може да работи и с подзаявки (просто намирам CTE за по-четлив)

В тази заявка използвам LEFT JOIN, за да комбинирам select1 и select2 и след това запазвам само тези редове от select1, които не се срещат в select2

Необходимо е обединяване на заявки. Например, има заявка за общи покупки на ден, има заявка за общи продажби на ден. Необходимо е полученият набор да съдържа следните полета: дата, обем на покупките, обем на продажбите. Как да го направим? За съжаление Interbase няма конструкция като select * from table1 ляво съединение (select * from table2).

1. изберете (изберете count(*) от table1), (изберете count(*) от table2) от rdb$database

Можете да използвате UNION, ако полетата на резултатанаборите от записи са еднакви

Може би съм разбрал погрешно въпроса ви, но какво ще стане, ако опитате това:

Ако не, моля, обяснете по-подробно от какво имате нужда.

SELECT T1.ID, T2.ID FROM T1 FULL OUTER JOIN T2 ON (T2. >WHERE T1.ID IS NULL OR T2.ID IS NULL

като това изберете t1.* от таблица1 t1 наляво се присъединете към таблица2 t2 към t1. > където t2.id е нула

изберете. от таблица1 където не съществува(изберете от таблица2 където. ) Ще работи ли?

Този въпрос не е затворен, той се редактира, когато въпросът се изпълнява.