Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как правильно обработать синонимы / 20 сообщений из 20, страница 1 из 1
14.02.2017, 12:03
    #39404025
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Всем добрый день.
Выполняю задачу по подготовке БД к слиянию. Есть 6 БД - хотим получить 1
Есть в базе справочник улиц.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE KLU (
    BD       SMALLINT NOT NULL,
    CODE     SMALLINT NOT NULL,
    OBL      SMALLINT,
    RAJ      SMALLINT,
    ADR      SMALLINT,
    VUL_COD  SMALLINT,
    VUL_CAT  SMALLINT,
    NAME     VARCHAR(50),
    NAM1     VARCHAR(5),
    NAM2     VARCHAR(25));

ALTER TABLE KLU ADD CONSTRAINT PK_KLU PRIMARY KEY (BD, CODE);



Данные для перекодировки делаю с так называемой эталонной базой (BD=0)
Есть ХП которая выбирает уникальные значения по полям OBL, ADR, VUL_CAT, NAME

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create or alter procedure ETALON_KLU
returns (
    BD       SMALLINT,
    CODE     SMALLINT,
    OBL      SMALLINT,
    RAJ      SMALLINT,
    ADR      SMALLINT,
    VUL_CAT  SMALLINT,
    NAME     VARCHAR(50))
AS
declare variable L_CODE integer = 0;
BEGIN
  FOR
      SELECT distinct OBL,ADR,VUL_CAT,upper(NAME)
        FROM klu
        order by upper(name)
        INTO: OBL,ADR,VUL_CAT,NAME
    DO
      BEGIN
        bd=0;
        raj=49;
        l_code=l_code+1;
        CODE=l_code;
        SUSPEND;
      END
END



Небольшой кусочек данных:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Разный регистр
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (1,183,12,1,0,197,1, '25-РIЧЧЯ ЖОВТНЯ','25-РI','ЧЧЯ ЖОВТНЯ');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (3,113,12,49,0,197,1,'25-рiччя жовтня','25-рi','ччя жовтня');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (1,184,12,1,0,1776,1,'40-РIЧЧЯ ЖОВТНЯ','40-РI','ЧЧЯ ЖОВТНЯ');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (3,1,12,49,0,1776,1, '40-рiччя жовтня','40-рi','ччя жовтня');

Синонимичные названия
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (6,191,12,1,0,,1,   'БАТУРИНСКАЯ','БАТУР','ИНСКАЯ');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (2,23, 12,1,0,,1,   'БАТУРИНСКАЯ','БАТУР','ИНСКАЯ');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (3,23,12,1,0,127,1, 'БАТУРИНСЬКА','БАТУР','ИНСЬКА');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (5,191,  12,1,0,,1, 'БАТУРИНСЬКА','БАТУР','ИНСЬКА');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (1,194,12,1,0,127,1,'БАТУРИНСЬКА','БАТУР','ИНСЬКА');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (4,191,12,1,0,,1,   'БАТУРИНСЬКА','БАТУР','ИНСЬКА');

INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (4,195,12,1,0,,1,   'БАШКIРСЬКА','БАШКI','РСЬКА');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (5,195,12,1,0,,1,   'БАШКIРСЬКА','БАШКI','РСЬКА');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (6,195,12,1,0,,1,   'БАШКИРСКАЯ','БАШКИ','РСКАЯ');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (2,105,12,1,0,,1,   'БАШКИРСКАЯ','БАШКИ','РСКАЯ');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (3,105,12,1,0,488,1,'БАШКИРСЬКА','БАШКИ','РСЬКА');
INSERT INTO KLU (BD, CODE, OBL, RAJ, ADR, VUL_COD, VUL_CAT, NAME, NAM1, NAM2) VALUES (1,197,12,1,0,488,1,'БАШКИРСЬКА','БАШКИ','РСЬКА');



Как победить разный регистр в поле NAME я придумал, написал upper(NAME).
Но осталась еще одна проблема:
Есть названия на разных языках - русский и украинский.
Так как работа не стоит, а люди продолжают работать с БД хочу все подготовить и в последний момент обновить таблицы перекодировок.
Чуть позже будет добавлено поле NEW_CODE с новым кодом для старых названий, пока вопрос получить правильную эталонную базу

Посоветуйте: Если сделать таблицу синонимов - можно ли в ХП встроить подбор
Могу сделать таблицу синонимов (вручную), но не понимаю как потом ее прикрутить к ХП.

--------------------------
Firebird 3.0.1.32609;
IBExpert 2017.2.7.1
Windows 10 32-bit;
4Gb RAM;
SSD 512Mb + HDD 1 Tb;
Настройки по умолчанию
...
Рейтинг: 0 / 0
14.02.2017, 12:10
    #39404030
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
akrushКак победить разный регистр в поле NAME я придумал, написал upper(NAME).можно и при помощи соответствующего COLLATE.
akrushЕсть названия на разных языках - русский и украинский.тут, имхо, нужно заводить таблицу "синонимов".
...
Рейтинг: 0 / 0
14.02.2017, 12:12
    #39404033
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Мимопроходящий,
Я про это и пишу.
Что таблицу синонимов могу сделать.
Но не знаю как дальше прикрутить выбор
...
Рейтинг: 0 / 0
14.02.2017, 12:24
    #39404040
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
COLLATE в базе сейчас установлен WIN151_UA.
База таблиц перекодировок создавалась вот так:
CREATE DATABASE 'DATABASE.fdb'
USER 'SYSDBA' PASSWORD '-=CENSORED=-'
PAGE_SIZE 16384
DEFAULT CHARACTER SET WIN1251 COLLATION WIN1251_UA;
...
Рейтинг: 0 / 0
14.02.2017, 12:39
    #39404051
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
akrushЧто таблицу синонимов могу сделать.
Но не знаю как дальше прикрутить выбор
Раз люди работают непрерывно - не парься и тупо сваливай всё в кучу. С дублированиями
будешь разбираться потом, по ходу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2017, 12:56
    #39404068
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Dimitry SibiryakovakrushЧто таблицу синонимов могу сделать.
Но не знаю как дальше прикрутить выбор
Раз люди работают непрерывно - не парься и тупо сваливай всё в кучу. С дублированиями
будешь разбираться потом, по ходу.


Увы не покатит. Мне нужно подготовить правильную таблицу сразу. Потом не получится т.к. проблема кроется в том что сама БД не Clarion 2.1. Я потом туда доступа не буду иметь.
ОЧЕНЬ желательно сражу получить таблицу. Или, как вариант, с дублированиями в Эксель и там ручками :(
...
Рейтинг: 0 / 0
14.02.2017, 12:59
    #39404071
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Извините за очепятки. "путаю педали" :) ;)
...
Рейтинг: 0 / 0
14.02.2017, 13:05
    #39404081
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Hello, Akrush!
You wrote on 14 февраля 2017 г. 13:02:26:

Akrush> Я про это и пишу.
> Что таблицу синонимов могу сделать.
> Но не знаю как дальше прикрутить выборуточни куда именно ты хочешь её прикрутить?
если синоним может быть только один, а не несколько,
то тупо цепляй LEFT JOIN-ом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2017, 13:17
    #39404088
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Мимопроходящий,
Увы, из примера данных который я прикрепил видно что, не считая правильного названия может быть еще 2 других.
Итого: 3 названия = 1 правильное название
...
Рейтинг: 0 / 0
14.02.2017, 13:18
    #39404092
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Думаю сделать таблицу синонимов:
CREATE TABLE KLU_SYNONIM (
NAME_GOOD VARCHAR(50),
NAME_BAD VARCHAR(50));

Если неправильно - подскажите как лучше.

Пошел "курить" Делфи для создания таблицы синонимов :(
А потом возможно и обработка
...
Рейтинг: 0 / 0
14.02.2017, 13:56
    #39404125
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Задам вопрос на туже тему но чуть-чуть по другому постановка задачи.
Если я создам таблицу синонимов (как писал выше)
Заполню ее из скрипта, до внесения данных.

Возможно ли в тригере при добавлении записи проверить
if new.name=synonim.name_bad then new.name=synonum.name_good

В таблице синонимов будут ВСЕ варианты, даже если в БД нет разночтений - будет 1 запись в синониме BAD=GOOD

Такое возможно??
...
Рейтинг: 0 / 0
14.02.2017, 13:57
    #39404126
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
akrushМне нужно подготовить правильную таблицу сразу. Потом не получится т.к. проблема кроется в
том что сама БД не Clarion 2.1. Я потом туда доступа не буду иметь.

Тогда обломись. Слияние даже двух (а у тебя целых шесть) активных баз это долгий
итерационный процесс, прерываемый на раздавание люлей пользователям. Так чтобы "раз всё
прогнал и наступило счастье" - не бывает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2017, 13:59
    #39404129
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Можно ли в тригере при проверке значения использовать Select
...
Рейтинг: 0 / 0
14.02.2017, 14:00
    #39404132
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
akrush,

NAME_BAD это просто пипец какой-то.

Обычно делают через ссылку синонима на основную сущность.
...
Рейтинг: 0 / 0
14.02.2017, 14:50
    #39404183
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Можно ли делать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create or alter trigger TR_USER_V_BI for USER_V
active before insert position 0
as
begin
  /* Trigger text */
    new.NAME = (select SYNONIM.NAME_GOOD
                from SYNONIM
                where SYNONIM.TABL = 'user' and
                      SYNONIM.NAME_BAD = new.NAME);
end
...
Рейтинг: 0 / 0
14.02.2017, 14:52
    #39404185
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Просто я хочу разобраться что и как "работает"
У меня в NAME вставило всем NULL

Понимаю что что-то не так, но не могу понять где.
...
Рейтинг: 0 / 0
14.02.2017, 14:53
    #39404188
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Hello, Akrush!
You wrote on 14 февраля 2017 г. 14:52:47:

Akrush> Можно ли делать так:а если их там не один?
а если ни одного?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2017, 14:53
    #39404189
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
Select в трегере возвращает только 1 значение
...
Рейтинг: 0 / 0
14.02.2017, 14:58
    #39404193
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
С тригером разобрался.

Имена приводятся в нормальный вид.
...
Рейтинг: 0 / 0
14.02.2017, 17:23
    #39404316
akrush
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно обработать синонимы
МОДЕРАТОР
вопрос для себя полностью решил. Можно удалить
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как правильно обработать синонимы / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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