cross join таблиц, одна из к-рых содержит 1 строку: как сделать обращение к ней 1 раз ?

Таблоид
Дата: 15.06.2012 23:05:05
hi all

DDL:
create sequence g;
commit;
create table tx(id int);
commit;
insert into tx values(1);
insert into tx values(2);
insert into tx values(3);
insert into tx values(4);
insert into tx values(5);
commit;


Требуется выбрать строки из таблицы tx, "приклеив" к ним доп. столбец с очередным значением генератора `g`.
То есть, для текущего (до "дёргания") значения gen_id(g,0) = 0 нужно получить вот это:
  G           ID
=== ============
1 1
1 2
1 3
1 4
1 5
Затем, при следующей такой выборке в поле `G` должно быть 2, и т.д.

Нижеследующий вариант возвращает неверный результат (в т.ч. если раскомментарить любой из фрагментов):
SQL> alter sequence g restart with 0; commit;
SQL> select x.g, t.id from (select /* first 1 */ gen_id(g,1) g from rdb$database /* rows 1 */)x cross join tx t;
Несмотря на полную независимость выборок, ФБ лезет за генератором столько раз, сколько строк в правом источнике:
PLAN JOIN (X RDB$DATABASE NATURAL, T NATURAL)

G ID
===================== ============
1 1
2 2
3 3
4 4
5 5

Перемена источников местами на результат также не влияет:
SQL> alter sequence g restart with 0; commit;
SQL> select x.g, t.id from (select first 1 gen_id(g,1) g from rdb$database)x cross join tx t;

PLAN JOIN (X RDB$DATABASE NATURAL, T NATURAL)

G ID
===================== ============
1 1
2 2
3 3
4 4
5 5

Выкрутиться можно, если заставить его агрегировать результат обращения к генератору:
SQL> alter sequence g restart with 0; commit;
SQL> select x.g, t.id from (select min(gen_id(g,1)) g from rdb$database)x cross join tx t;

PLAN JOIN (X RDB$DATABASE NATURAL, T NATURAL)

G ID
===================== ============
1 1
1 2
1 3
1 4
1 5

Но почему он не догадался обратиться к записям этого источника без применения min ?
Таблоид
Дата: 15.06.2012 23:47:16
Поправлю:
Таблоид
Но почему он не догадался однократно обратиться к записям этого источника без применения min ?
Кузнецов Евгений
Дата: 16.06.2012 00:23:01
Таблоид
Но почему он не догадался однократно обратиться к записям этого источника без применения min ?

Ну давайте порассуждаем. Для случая min движок, по-видимому, знает, что это скалярное значение, и ведет себя соответственно, вычисляя его единожды.
select (first 1) from rdb$database - это список из одного элемента, и получаем fetch со всеми вытекающими. Кэшировать наборы данных FB еще (не знаю, как в 3.0) без применения SORT не умеет.
--
BR, Евгений
Гаджимурадов Рустам
Дата: 16.06.2012 00:33:16

1. Для min тоже делается фетч.
2. Для min тоже не делается sort.

Posted via ActualForum NNTP Server 1.5

Stupid_BOT
Дата: 16.06.2012 00:41:55
Таблоид,

set term !;
create procedure pg returns (x int) as begin x=gen_id(g,1); suspend; end!
set term ;!

alter sequence g restart with 0; commit;
select x.g,t.id from (select x g from pg)x cross join tx t;


G ID
============ ============
1 1
1 2
1 3
1 4
1 5
Кузнецов Евгений
Дата: 16.06.2012 00:46:02
Мда, похоже, чушь написал. Спать надо.
Гаджимурадов Рустам
Дата: 16.06.2012 00:50:44

Stupid_BOT> create procedure pg returns (x int) as begin x=gen_id(g,1); suspend; end!

Друх! Ну нельзя же каждым постом так откровенно оправдывать свой ник!

Posted via ActualForum NNTP Server 1.5

Stupid_BOT
Дата: 16.06.2012 00:52:19
Гаджимурадов Рустам,
я что-то совсем глупое написал? *без капли сарказма*
Гаджимурадов Рустам
Дата: 16.06.2012 00:55:49

Stupid_BOT> я что-то совсем глупое написал?

1. Надо читать заголовок. Там сказано с чем именно проблема - с
cross join (вернее, проблема не в нем, но воспроизводится с ним).

2. Таблоид не идиот и без подсказок может догадаться о способах
получения значения генератора - при чем более адекватных, чем
создание для этого отдельной ХП.

Posted via ActualForum NNTP Server 1.5

Stupid_BOT
Дата: 16.06.2012 01:03:08
Гаджимурадов Рустам,

1) заголовки не всегда адекатно описыают ТЗ :)
В первом посте Таблоида, аккурат под "DDL"
> Требуется выбрать строки из таблицы tx, "приклеив" к ним доп. столбец с очередным значением генератора `g`.
> То есть, ...

2) Даже гения иногда может "заклинить".
Рустам, может Вы подскажите, пускай не Таблоиду, - мне, более адекватные способы решения проблемы этого топика ?