Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Загадка Informix 12 / 25 сообщений из 38, страница 1 из 2
14.11.2013, 12:44
    #38464866
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
IDS 12.10.FC1

Создаем:
Код: sql
1.
2.
3.
create table _aaa (id serial, name varchar(32));

create table _bbb (id serial, name varchar(32));



Вставляем:
Код: sql
1.
2.
3.
insert into _aaa (name) values ('ABCDEFGHIJKLMNOPQRUVWXYZ');

insert into _bbb (id, name) values (200000,'QWERTYUIOPASDFGHJKLZXCVBNM');



Выполняем в dbaccess:
Код: sql
1.
2.
3.
select * from _aaa a
  left join _bbb b on a.id = b.id
where b.id is null;



Получаем:

id name id_1 name_1
1 ABCDEFGHIJKLMNOPQRUVWXYZ NULL NULL

Чешем репу (с) :)
...
Рейтинг: 0 / 0
14.11.2013, 13:13
    #38464942
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
ak-47, Стоп это я неправильно упростил! Здесь норм Сейчас перепишу.
...
Рейтинг: 0 / 0
14.11.2013, 13:28
    #38464976
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
Еще разок

Создаем:
Код: sql
1.
2.
3.
create table _aaa (id serial not null, name varchar(32));

create table _bbb (id serial not null, name varchar(32));



Вставляем:
Код: sql
1.
2.
3.
insert into _aaa (name) values ('ABCDEFGHIJKLMNOPQRUVWXYZ');

insert into _bbb (name) values ('QWERTYUIOPASDFGHJKLZXCVBNM');



Сейчас запрос
Код: sql
1.
2.
3.
select * from _aaa a
  left join _bbb b on a.id = b.id
where b.id is null;



не возвращает записей,

Далее доводим кол-во записей в _bbb до 2048 и более

Код: sql
1.
insert into _bbb (name) select name from _bbb;



И предыдущий запрос начинает возвращать
id name id_1 name_1
1 ABCDEFGHIJKLMNOPQRUVWXYZ NULL NULL
...
Рейтинг: 0 / 0
14.11.2013, 15:56
    #38465256
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
drop table if exists _aaa;
drop table if exists _bbb;
create table _aaa (id serial(1) not null, name varchar(32));
create table _bbb (id serial(2) not null, name varchar(32));
insert into _aaa (name) values ('ABCDEFGHIJKLMNOPQRUVWXYZ');
insert into _bbb (name) values ('QWERTYUIOPASDFGHJKLZXCVBNM');
select * from _aaa a left join _bbb b on a.id = b.id where b.id is null;
insert into _bbb (name) select name from _bbb;
select * from _aaa a left join _bbb b on a.id = b.id where b.id is null;
insert into _bbb (name) select name from _bbb;
select * from _aaa a left join _bbb b on a.id = b.id where b.id is null;
insert into _bbb (name) select name from _bbb;
select * from _aaa a left join _bbb b on a.id = b.id where b.id is null;


Informix 11.70FC7W3
Всегда возвращает только одну запись, независимо от количества строк в _bbb
результат1 ABCDEFGHIJKLMNOPQRUVWXYZ NULL NULL
...
Рейтинг: 0 / 0
14.11.2013, 16:30
    #38465310
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
victor16Всегда возвращает только одну запись, независимо от количества строк в _bbb

Ух ты. Дело в том, что не должно быть там записи. Условие написано в where, а не в условии объединения ...on... and...
Такой результат должен возвращать запрос:

Код: sql
1.
2.
select * from _aaa a
  left join _bbb b on a.id = b.id and b.id is null



11.7.FC5, 11.7.TC4, считаю правильным выполнение:

Код: sql
1.
2.
3.
select * from _aaa a
  left join _bbb b on a.id = b.id
where b.id is null;


без записей

Код: sql
1.
2.
select * from _aaa a
  left join _bbb b on a.id = b.id and b.id is null



id name id_1 name_1
1 ABCDEFGHIJKLMNOPQRUVWXYZ NULL NULL
...
Рейтинг: 0 / 0
14.11.2013, 16:51
    #38465348
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
ak-47считаю правильным выполнение:

Код: sql
1.
2.
3.
select * from _aaa a
  left join _bbb b on a.id = b.id
where b.id is null;


без записей


Википедия похоже не согласна с Вами :)
...
Рейтинг: 0 / 0
14.11.2013, 17:01
    #38465378
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
Попробовал на 11.50.UC7W1. Результат не изменился от смены версии.
Ищите подвох в данных, хранящихся в таблицах.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
-- drop table if exists _aaa;
-- drop table if exists _bbb;
create table _aaa (id serial(1) not null, name varchar(32));
create table _bbb (id serial(2) not null, name varchar(32));
insert into _aaa (name) values ('ABCDEFGHIJKLMNOPQRUVWXYZ');
insert into _bbb (name) values ('QWERTYUIOPASDFGHJKLZXCVBNM');
select * from _aaa a left join _bbb b on a.id = b.id where b.id is null;
insert into _bbb (name) select name from _bbb;
select * from _aaa a left join _bbb b on a.id = b.id where b.id is null;
insert into _bbb (name) select name from _bbb;
select * from _aaa a left join _bbb b on a.id = b.id where b.id is null;
insert into _bbb (name) select name from _bbb;
select * from _aaa a left join _bbb b on a.id = b.id where b.id is null;

select * from _aaa;
select * from _bbb;
drop table _aaa;
drop table _bbb;


Всегда возвращает только одну запись, независимо от количества строк в _bbb
результат1 ABCDEFGHIJKLMNOPQRUVWXYZ NULL NULL
...
Рейтинг: 0 / 0
14.11.2013, 18:05
    #38465472
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
victor16, Почему вы в своем примере сериал в _bbb начинаете с 2 ? Там нечему объединятся. Такой результат меня не удивляет
...
Рейтинг: 0 / 0
14.11.2013, 18:07
    #38465474
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
victor16Википедия похоже не согласна с Вами :)

Прочитал, спасибо. Там приводится классический пример left join.
Объясню на данных из Википедии, что получается у меня:
У меня нет нулов во второй таблице, а есть условие where b.cityid is null
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create table city (id serial not null, name varchar(32));
create table person (cityid serial not null, name varchar(32));

insert into city (name) values ('Москва');

insert into person (name) values ('Андрей');
insert into person (name) values ('Леонид');
insert into person (name) values ('Сергей');



Запрос
Код: sql
1.
2.
3.
select * from city a
  left join person b on a.id = b.cityid 
where b.cityid is null;



Не должен возвращать записей. Как это и делается на 11.7.FC5, 11.7.TC4
На 12 наблюдаю тот же эффект что и раньше - нет записей, при добавлении в person более 2048 - есть.
Проверьте на 11.5 без serial(1), serial(2) в create, это было нечестно :)
...
Рейтинг: 0 / 0
14.11.2013, 18:20
    #38465511
Ikir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
victor16 Википедия похоже не согласна с Вами :)

+ реляционная алгебра :-)
...
Рейтинг: 0 / 0
14.11.2013, 18:23
    #38465518
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
Ikir+ реляционная алгебра :-)
обоснуй
...
Рейтинг: 0 / 0
14.11.2013, 19:18
    #38465589
Ikir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
ak-47,

Ну вы выполните
select * from _aaa a
left join _bbb b on a.id = b.id
без WHERE и увидите сколько у вас записей имеют b.id is NULL.
...
Рейтинг: 0 / 0
14.11.2013, 19:23
    #38465595
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
Ikir, я то это выполнил более десятка раз, и здесь писал, что их нет. И нет значение a.id, которых нет в b.id.
Выполните вы
...
Рейтинг: 0 / 0
14.11.2013, 19:35
    #38465605
Ikir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
ak-47Ikir, я то это выполнил более десятка раз, и здесь писал, что их нет. И нет значение a.id, которых нет в b.id.
Выполните вы

Вы на ходу меняете правила игры, а я так не играю.
...
Рейтинг: 0 / 0
14.11.2013, 19:44
    #38465617
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
Ikir, первый пост был, к сожалению ошибочным, я сразу исправился. Более правила игры не менялись.
Впрочем это ваше право. Не стОит.
...
Рейтинг: 0 / 0
14.11.2013, 20:47
    #38465678
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
ak-47Еще разок

Создаем:
Код: sql
1.
2.
3.
create table _aaa (id serial not null, name varchar(32));

create table _bbb (id serial not null, name varchar(32));



Вставляем:
Код: sql
1.
2.
3.
insert into _aaa (name) values ('ABCDEFGHIJKLMNOPQRUVWXYZ');

insert into _bbb (name) values ('QWERTYUIOPASDFGHJKLZXCVBNM');



Сейчас запрос
Код: sql
1.
2.
3.
select * from _aaa a
  left join _bbb b on a.id = b.id
where b.id is null;



не возвращает записей,

Далее доводим кол-во записей в _bbb до 2048 и более

Код: sql
1.
insert into _bbb (name) select name from _bbb;



И предыдущий запрос начинает возвращать
id name id_1 name_1
1 ABCDEFGHIJKLMNOPQRUVWXYZ NULL NULL

Вы смотрели собственно значения serial в обеих таблицах?

Если значения id в таблицах _aaa и _bbb в вашем примере начинаются с 1 и последовательно возрастают, то
согласно http://pic.dhe.ibm.com/infocenter/informix/v121/topic/com.ibm.sqls.doc/ids_sqs_1033.htm
запрос
Код: sql
1.
2.
3.
select * from _aaa a
  left join _bbb b on a.id = b.id
where b.id is null;


после добавления записи в _aaa:

1. до добавления записей в _bbb запрос должен возвращать 1 запись (ибо left join к одной записи в _aaa таки не сможет пришить записи из _bbb, после чего where пропустит в результат эту строку).

2. после добавления первой и всех последующих записей в _bbb должен всегда возвращать 0 записей (ибо left join к одной записи в _aaa таки пришьёт первую запись из _bbb, после чего where не пропустит в результат эту строку).

Если это не так, баг либо в доке 12.1, либо в серваке 12.1 :)
...
Рейтинг: 0 / 0
14.11.2013, 22:46
    #38465759
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
АнатоЛой, конечно смотрел, да, начинаются с 1, последовательно возрастают. Нулов нет!

Полностью согласен с докой и с вашими обоими комментариями. Условие where должно применяться на результат объединения. Т.е. в результате выполнения не должно возвращаться записей.
В 12.1 это не так, при условии большого кол-ва записей в присоединяемой таблице.

Это баг. И не доки. И немаленький.
...
Рейтинг: 0 / 0
15.11.2013, 08:25
    #38465937
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
ak-47Условие where должно применяться на результат объединения. Т.е. в результате выполнения не должно возвращаться записей.
В 12.1 это не так, при условии большого кол-ва записей в присоединяемой таблице.
Это баг. И не доки. И немаленький.
Можете привести работоспособный и воспроизводимый SQL-скрипт?
...
Рейтинг: 0 / 0
15.11.2013, 11:11
    #38466096
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
victor16Можете привести работоспособный и воспроизводимый SQL-скрипт?

Конечно.
Вот он.

Естественно, как добавил АнатоЛой: "значения id в таблицах _aaa и _bbb в примере начинаются с 1 и последовательно возрастают"

ЗЫ сегодня проверено еще на 12.1.UC1.DE
...
Рейтинг: 0 / 0
15.11.2013, 11:37
    #38466147
Ikir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
ak-47,
Несколько иные результаты :
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
-bash-3.2$ onstat -

IBM Informix Dynamic Server Version 12.10.FC2 -- On-Line -- Up 7 days 21:53:09 -- 13402112 Kbytes

-bash-3.2$ echo "select * from _aaa a
>   left join _bbb b on a.id = b.id
> ~
-bash-3.2$ echo "select count(*) from _aaa;select count(*) from _bbb;select * from _aaa a  left join _bbb b on a.id = b.id where b.id is null;" | dbaccess dbadb

Database selected.



      (count(*))

               1

1 row(s) retrieved.



      (count(*))

            4096

1 row(s) retrieved.




No rows found.



Database closed.
...
Рейтинг: 0 / 0
15.11.2013, 12:10
    #38466211
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
Ikir, спасибо. Значит известно и пофиксено. Как поставим FC2 - отпишусь.
...
Рейтинг: 0 / 0
15.11.2013, 15:54
    #38466605
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
IBM Informix Dynamic Server Version 12.10.FC2

Без изменений
Во вложении файл с оформленным работоспособным, воспроизводимым скриптом.
Результат dbaccess:
id 1
name ABC
id
name
...
Рейтинг: 0 / 0
15.11.2013, 16:36
    #38466692
Ikir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
ak-47,
Что то в консерватории не так.
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
-bash-3.2$ dbaccess dbadb test.sql

Database selected.
Table dropped.
Table dropped.
Table created.
Table created.
1 row(s) inserted.
1 row(s) inserted.
1 row(s) inserted.
2 row(s) inserted.
4 row(s) inserted.
8 row(s) inserted.
16 row(s) inserted.
32 row(s) inserted.
64 row(s) inserted.
128 row(s) inserted.
256 row(s) inserted.
512 row(s) inserted.
1024 row(s) inserted.
2048 row(s) inserted.
4096 row(s) inserted.

No rows found.


Table dropped.


Table dropped.


Database closed.



Ну поставьте после своего SELECT еще один
select * from _bbb b where b.id = 1;...
Попробуйте объявить переменные serial8...
...
Рейтинг: 0 / 0
15.11.2013, 16:55
    #38466722
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
IkirНу поставьте после своего SELECT еще один
select * from _bbb b where b.id = 1;

да здесь без проблем:
Код: sql
1.
2.
select * from _aaa a where a.id = 1;
select * from _bbb b where b.id = 1;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
id    1
name  ABC
id
name

1 row(s) retrieved.



         id name

          1 ABC

1 row(s) retrieved.



         id name

          1 DEF

1 row(s) retrieved.
...
Рейтинг: 0 / 0
15.11.2013, 17:26
    #38466768
ak-47
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадка Informix 12
Подменили конфиг - заработал правильно. Разбираем настройки.
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Загадка Informix 12 / 25 сообщений из 38, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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