powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проблема в получении уникального списка символов, получаемых через left(uuid,1)
5 сообщений из 5, страница 1 из 1
Проблема в получении уникального списка символов, получаемых через left(uuid,1)
    #38582002
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Возникло смутное сомнение, что данные random-природы *не* подвержены никаким видам материализации.

Например, в LI-V2.5.3.26744 вот эти все варианты:
Код: 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.
27.
28.
29.
30.
31.
-- var 1.
select distinct c
from(
    select distinct left(uuid_to_char(gen_uuid()),1) c from rdb$formats
) x;

------------
-- var 2.
select c
from(
    select left(uuid_to_char(gen_uuid()),1) c from rdb$formats
    group by 1
) x
group by c;

------------
-- var 3.
select distinct c
from(
    select left(uuid_to_char(gen_uuid()),1) c from rdb$formats
    group by 1
) x
;

------------
-- var 4.
select c
from(
    select distinct left(uuid_to_char(gen_uuid()),1) c from rdb$formats
) x
group by c;

- никогда не выдадут уникальный список значений, обязательно будут дубли.

А в LI-T3.0.0.30889 варианты 2 и 3 вообще выдают ноль строк.

PS. И даже тройной одеколон distinct не помогает:
Код: sql
1.
2.
3.
4.
5.
6.
select distinct c
from(
    select distinct c from (
      select distinct left(uuid_to_char(gen_uuid()),1) c from rdb$formats
    ) x
) x;



PS-2. Спасает только тройной group by:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select c
from(
    select c from (
      select left(uuid_to_char(gen_uuid()),1) c from rdb$formats group by c
    ) x
    group by c
) x
group by c;

- но... только в 2.5 :'(
В трёшке он возвращает пустое множество.
...
Рейтинг: 0 / 0
Проблема в получении уникального списка символов, получаемых через left(uuid,1)
    #38582015
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВозникло смутное сомнение, что данные random-природы *не* подвержены никаким видам материализации
ты знал! Материализуются только поля таблиц, выражения всегда перевычисляются.
...
Рейтинг: 0 / 0
Проблема в получении уникального списка символов, получаемых через left(uuid,1)
    #38582023
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТаблоидВозникло смутное сомнение, что данные random-природы *не* подвержены никаким видам материализации
ты знал! Материализуются только поля таблиц, выражения всегда перевычисляются.а почему тогда:авторPS-2. Спасает только тройной group by:

select c
from(
select c from (
select left(uuid_to_char(gen_uuid()),1) c from rdb$formats group by c
) x
group by c
) x
group by c;

- но... только в 2.5 :'(
В трёшке он возвращает пустое множество.
...
Рейтинг: 0 / 0
Проблема в получении уникального списка символов, получаемых через left(uuid,1)
    #38582024
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ХЗ почему, не разбирался
...
Рейтинг: 0 / 0
Проблема в получении уникального списка символов, получаемых через left(uuid,1)
    #38585403
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидВозникло смутное сомнение, что данные random-природы *не* подвержены никаким видам материализации.Еще один пример. Результаты его поражают мну в самое сердце
DDL:
Код: plaintext
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.
SQL> recreate table tmp(id int, x int); commit;
SQL> insert into tmp select row_number()over(),rand()*100 from rdb$types,rdb$types rows 10000; commit;
SQL> select count(*) from tmp; -- 10'000
SQL> set planonly;
SQL> set explain on;
SQL> select
CON>  b.rx
CON> ,( select min(id)||' '||max(id)||' '||count(id)
CON>     from (select id, row_number()over() rn from tmp) where rn=b.rx
CON>  ) as agg_info
CON> from ( select cast(round((0.5+rand()*10000 ),0) as int) rx from rdb$database rows 1 ) b;

Select Expression
    -> Singularity Check
        -> Aggregate
            -> Filter
                -> Window
                    -> Record Buffer (record length: 25)
                        -> Table "TMP" Full Scan
Select Expression
    -> First N Records
        -> Table "B RDB$DATABASE" Full Scan
SQL> set planonly;
SQL> set plan off;
SQL> set explain off;

Сохраняем вышеприведенный запрос в скрипте (у мну - 'rand.sql') и начинаем гонять его.
Вижу диво дивное:
Код: plaintext
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        2083 <null>

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        6980 6301 9805 3

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        9745 7540 7540 1

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
         199 8384 8384 1

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        5451 7240 7240 1

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
         691 7088 7088 1

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        5572 <null>

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        4767 <null>

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        9585 2287 2287 1

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        8338 <null>

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        9651 8052 9448 2

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
         957 3499 8816 2

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        3251 8677 8677 1

SQL> in rand.sql;

          RX AGG_INFO
============ ============================================
        6678 158 5398 2
Кто-нить может объяснить, откудова в результатах:
1) NULL'ы, т.е. выборка select * from (select id, row_number()over() rn from tmp) where rn=NNNN - была пустая; конкретно для показанных выше результатов это, разумеется, не так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> select * from (select id, row_number()over() rn from tmp) where rn=2083;

          ID                    RN
============ =====================
        2083                  2083

SQL> select * from (select id, row_number()over() rn from tmp) where rn=8338;

          ID                    RN
============ =====================
        8338                  8338

2) отличия в min(id) vs max(id) в выборке select ... from (select id, row_number()over() rn from tmp) where rn=b.rx, что приводит к двум и даже более записям, получаемым скалярным подзапросом
Код: plaintext
1.
2.
3.
          RX AGG_INFO
============ ============================================
        6980 6301 9805  3 
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проблема в получении уникального списка символов, получаемых через left(uuid,1)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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