powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Установление неявного соответствия между строками
41 сообщений из 41, показаны все 2 страниц
Установление неявного соответствия между строками
    #38992204
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеются две таблицы T1, T2 с одинаковым набором полей: ID (INTEGER, PRIMARY KEY) и A (INTEGER). Значения ID двух таблиц никак не связаны между собой. Таблицы содержат одинаковое количество записей. Требуется одним запросом обновить значение поля A таблицы T1 так, чтобы следующие запросы возвращали одинаковый результат с точностью до порядка записей:
Код: sql
1.
SELECT A FROM T1 ORDER BY ID


Код: sql
1.
SELECT A FROM T2 ORDER BY ID



Версия Firebird: 1.5 .
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992382
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Interloper!
You wrote on 25 июня 2015 г. 11:06:32:

Interloper> Требуется одним запросом...
Версия Firebird: 1.5.обломись.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992388
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Interloper,

делай ХП и вызывай её одним запросом
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992398
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Симонов Денисделай ХП и вызывай её одним запросом
Ещё можно сделать EXECUTE BLOCK, одним запросом.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992400
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Симонов Денисделай ХП и вызывай её одним запросом
Ещё можно сделать EXECUTE BLOCK, одним запросом.

МимопроходящийHello, Interloper!
You wrote on 25 июня 2015 г. 11:06:32:

Interloper> Требуется одним запросом...
Версия Firebird: 1.5. обломись .
Выделил для анонимных слабозрячих.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992404
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
miwaonlineВыделил для анонимных слабозрячих.
Респект от анонимных слабозрячих :)
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992424
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Боюсь, обломаться придется тебе, потому что решение есть и оно работает на 1.5.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992429
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterloperМимопроходящий,
Боюсь, обломаться придется тебе, потому что решение есть и оно работает на 1.5.

Решение одним запросом в студию.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992448
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Граур Станислав,

А самому подумать?
Решение я приведу, если никто не выложит его раньше.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992452
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Interloper,

т.е. ты загадки тут задаешь?
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992461
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

На момент написания вопроса я не знал решения. Тебя что-то смущает тут?
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992462
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Interloper,

нам оно тожеинтересно. Ибо как это сделать в 1.5 одним запросом без ХП я не представляю.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992466
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

А в чем принципиальная сложность сделать это в 1.5, по-вашему?
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992472
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Interloper,

сложность в формулировке. Я вот вижу только один способ грохнуть всё из T1 и залить в неё записи из T2.
Ибо условие

> Значения ID двух таблиц никак не связаны между собой.

Что в T1 могут быть такие ID которых нет в T2 и наоборот.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992485
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

А нам не нужно, чтобы ID были одинаковые у них. Нам важно, чтобы значения столбца A из T2 "спроецировались" на столбец A в T1 в том же порядке, что и в T2 при сортировке по ID.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992489
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тебе Т1:
IDA1144
Вот тебе Т2:
IDA2233
Проецируй!
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992495
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример.
Таблица T1:
ID A
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0

Таблица T2:
ID A
2 1
3 2
5 3
7 4
11 5
13 6
17 7
19 8
23 9
29 10

После выполнения запроса таблица T1 должна иметь вид:
ID A
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992500
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Должно получиться:
1 2
4 3
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992515
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterloperДолжно получиться:
А не получится. Нет способа сделать это в 1.5 одним запросом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992519
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

На чем основано данное утверждение? У меня получилось.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992520
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterloperУ меня получилось.

Значит ты либо чего-то не учёл, либо нарушил одно из условий.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992526
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Interloper,

ну так выложи решение. Или оно очень секретное
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992532
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм. А проще вот этого можно?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or alter procedure PRC
as
declare variable A_T2 integer;
declare variable ID_T1 integer;
declare variable i integer;
begin
  i = 0;
  --Сортируем по id
  for select a from t2 order by id into :a_t2 do
  begin
     -- c помощью skip берем id из нужной строки
     select first 1 skip (:i) id from t1 order by id into :id_t1;

     -- Обновляем :-)
     update t1 set t1.a = :a_t2 where t1.id = :id_t1;
     i = i+1;
  end
end
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992551
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот решение:

Код: sql
1.
2.
UPDATE T1 T11
SET T11.A = (SELECT FIRST 1 SKIP ((SELECT COUNT(1) FROM T1 T12 WHERE T12.ID<T11.ID)) T2.A FROM T2 ORDER BY T2.ID)
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992560
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуток меняем данные и решение становится не рабочим.

Вот тебе Т1:
IDA1144
Вот тебе Т2:
IDA5233
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992579
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

С чего бы? UPDATE идет по индексу первичного ключа. Проверил, все ок.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992584
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Безумное предложение. Берём генератора - G1 и G2 - с равными значениями...
Код: 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.
-- это выборка из первой таблицы SEL1
select 
  T1.id as idl, T1.a, g1.gv as gvl
from 
  Ti
  left join (
    select gen_id(Gi) as gv from rdb$database) as g1
   
-- её можно сджойнить с аналогичной выборкой SEL2 (из второй таблицы) по gvl
select ...
from 
  SEL1 
  left join SEL2
    on SEL1.gvl = SEL2.gvl

-- Т.е. получаем набор данных, где T1.A соответствует T2.A. 
-- Заметим, что если никто не трогает генераторы, а кол-во
-- записей в таблицах всегда совпадает, то набор можно получать
-- сколь угодно часто.

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

-- И вуаля!
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992596
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterloperВот решение:
Как я и подозревал, оно трёхэтажное. Сойдёт для sql-ex.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992665
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Главное, что оно рабочее. А люди здесь безаппеляционно утверждали, что в FB 1.5 так сделать нельзя и при этом не приводили никаких аргументов. Это как минимум странно для такого серьезного сообщества профессионалов, как sql.ru.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992674
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCatБезумное предложение. Берём генератора - G1 и G2 - с равными значениями...
Код: 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.
-- это выборка из первой таблицы SEL1
select 
  T1.id as idl, T1.a, g1.gv as gvl
from 
  Ti
  left join (
    select gen_id(Gi) as gv from rdb$database) as g1
   
-- её можно сджойнить с аналогичной выборкой SEL2 (из второй таблицы) по gvl
select ...
from 
  SEL1 
  left join SEL2
    on SEL1.gvl = SEL2.gvl

-- Т.е. получаем набор данных, где T1.A соответствует T2.A. 
-- Заметим, что если никто не трогает генераторы, а кол-во
-- записей в таблицах всегда совпадает, то набор можно получать
-- сколь угодно часто.

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

-- И вуаля!


Идея имеет право на существование. Но в FB 1.5 разве можно делать джойны подзапросов?
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992676
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Interloper,

эффективность этого решения оставляет желать лучшего. Попробуй прогони его на табличках с десятками миллионов записей
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992692
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Не спорю. Но сама задачка весьма интересна.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992696
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пощупай на других SQL-серверах и огорчись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992706
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Речь здесь о Firebird. На других серверах также задача решается, например, очень просто сделать это на Oracle с использованием материализованных представлений WITH.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992716
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterloperМимопроходящий,

Речь здесь о Firebird. На других серверах также задача решается, например, очень просто сделать это на Oracle с использованием материализованных представлений WITH.

На Oracle 1.0 ?
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992721
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Interloper,

в тройке тоже можно намного эффективней сделать

Код: 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.
MERGE INTO T1
USING (WITH T1_1
       AS (SELECT
               ID,
               A,
               ROW_NUMBER() OVER(ORDER BY ID) AS RN
           FROM
               T1),
       T2_2
       AS (SELECT
               ID,
               A,
               ROW_NUMBER() OVER(ORDER BY ID) AS RN
           FROM
               T2)
       SELECT
           T1_1.ID AS ID,
           T2_2.A AS A
       FROM
           T1_1
           JOIN T2_2 ON T1_1.RN = T2_2.RN) SRC  
ON T1.ID = SRC.ID
WHEN MATCHED THEN
  UPDATE SET A = SRC.A
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992723
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Interloper!
You wrote on 25 июня 2015 г. 14:32:57:

Interloper> с использованием материализованных представлений WITH.
безалаберное использование малознакомых терминов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38992755
Interloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Да нет, понятно о чем идет речь. Гораздо более безалаберно было утверждать "обломись на 1.5". У чужих в глазу соринку видим?
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38993032
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterloperЭто как минимум странно для такого серьезного сообщества профессионалов, как sql.ru.Профессионалы потому и серьёзные, что не лезут на шкаф только потому, что это возможно.
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38993224
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterloperДа нет, понятно о чем идет речь. Гораздо более безалаберно было утверждать "обломись на 1.5". У чужих в глазу соринку видим?

Ради интереса сделал тестовый пример. Залил совсем чуть-чуть записей 10к штук

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Запрос автора 
Время работы 1 мин 30 сек
Кол-во чтений T1    49 995 000
Кол-во чтений T2    50 005 000 


Процедура с for select и поиском id по skip (см мой пост выше)
Время работы          37 сек
Кол-во чтений T1   50 015 000
Кол-во чтений T2       10 000


(в FB 2.0 и выше)
Процедура с for select по одной таблице и declare cursor по второй таблице
Время работы  265  мс 
Кол-во чтений T1       20 000
Кол-во чтений T2       10 000


На FB 1.5 я бы добавил в каждую таблицу по дополнительному столбцу ido integer и запустил бы такую SP
Код: plsql
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.
create or alter procedure PRC3
as
declare variable I integer;
declare variable ID integer;
declare variable A integer;
begin
  i = 1;
  for select id from t1 order by id into :id do
  begin
     update t1 set t1.ido = :i where id = :id;
     i = i + 1;
  end

  i = 1;
  for select id from t2 order by id into :id do
  begin
     update t2 set t2.ido = :i where id = :id;
     i = i + 1;
  end

  for select id, a from t2 order by id into :id, :a  do
  begin
     update t1 set t1.a = :a where t1.ido = :id;
  end
end



Код: plaintext
1.
2.
Время работы  9 с
Кол-во чтений T1       20 000
Кол-во чтений T2       30 000
...
Рейтинг: 0 / 0
Установление неявного соответствия между строками
    #38993333
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Граур Станислав,

мой запрос. В каждой таблице по 10k записей

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
10000 записей было обновлено в таблице T1

------ Информация о производительности ------
Время подготовки запроса = 47ms
Время выполнения запроса = 281ms
Current memory = 145 457 264
Max memory = 153 581 000
Memory buffers = 16 384
Reads from disk to cache = 0
Writes from cache to disk = 0
Чтений из кэша = 174 548

но он только на трёшке работает
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Установление неявного соответствия между строками
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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