powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FULL JOIN
2 сообщений из 2, страница 1 из 1
FULL JOIN
    #32018993
Valk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеем следующие Stored Procedures (схематично основная структура):
- StoredProc1(p1, p2) returns (V, x1, x2):
begin
for Select *
from Table1
where Field1=p1 and Field2=p2
end;
- StoredProc2 (p1, p2) returns (V, y1, y2) - тоже самое, только для Table2
- StoredProc3 (p1, p2) returns (V, z1, z2) - тоже самое, только для Table3
- StoredProc4 (p1, p2) returns (V, q1, q2) - тоже самое, только для Table4

Таким образом, каждая из процедур возвращает определенное подмножество из
соответствующих таблиц.
Мне необходимо получить множество записей такой
структуры:
V , x1, x2, y1, y2, z1, z2, q1, q2 (РезМножество)
т.е. необходимо состыковать множества, возвращаемые процедурами по полю V,
при этом "стыкуемость" этих множеств по полю V заранее не известна,
т.е. (РезМножество) может иметь вид:
1, x11 , x21 , y11 , y21 , z11 , z21 , q11 , q21
2, null , null , y12 , y22 , z11 , z21 , null , null
3, x12 , x22 , y13 , y23 , null , null , null , null
и т.п.

Напрашивается использование FULL JOIN:
SELECT * FROM
StoredProc1 sp1
FULL JOIN StoredProc2 sp2 ON (sp2.V=sp1.V) (**)
FULL JOIN StoredProc3 sp3 ON (sp3.V=sp1.V)
FULL JOIN StoredProc4 sp4 ON (sp4.V=sp1.V)

При этом предположим, что в частном случае
StoredProc1 возвращает 3 строки;
StoredProc2 - 3 строки;
StoredProc3 - 2 строки;
StoredProc4 - 3 строки.

QuickDesk 2.0 показывает:
+--------------------------+-------+
|........Table Name........|.Index |
|..........................|.reads |
+--------------------------+-------+
|..RDB$PROCEDURE_PARAMETERS|____12 |
|....................TABLE2|___144 |
|....................TABLE3|____32 |
|....................TABLE4|____12 |
|....................TABLE1|___144 |
|..RDB$RELATION_CONSTRAINTS|_____0 |
+--------------------------+-------+
При этом результат выдается правильный.
Расстановка дополнительных скобок в запросе ничего не меняет.

Если, же создать две промежуточные процедуры:
- StoredProcX:
begin
for Select * from
StoredProc1 sp1
FULL JOIN StoredProc2 sp2 ON (sp2.V=sp1.V)
end

- StoredProcY:
begin
for Select * from
StoredProc3 sp3
FULL JOIN StoredProc4 sp4 ON (sp4.V=sp3.V)
end

А потом:
SELECT * FROM
StoredProcX spX
FULL JOIN StoredProcY spY ON (spX.V=spY.V) (***)

QuickDesk 2.0 показывает: (!)
+--------------------------+-------+
|........Table Name........|.Index |
|..........................|.reads |
+--------------------------+-------+
|..RDB$PROCEDURE_PARAMETERS|_____8 |
|....................TABLE2|____48 |
|....................TABLE3|____20 |
|....................TABLE4|____18 |
|....................TABLE1|____48 |
|..RDB$RELATION_CONSTRAINTS|_____0 |
+--------------------------+-------+
При этом результат - тот же
***********************************************
ХОТЕЛОСЬ БЫ ВЫЯСНИТЬ:
1. Нельзя ли как-то еще оптимизировать запрос (**) ?
2. В запросе (**) раздел ON имеет вид (sp(i).V=sp1.V),
другие варианты, например, (sp(i).V=sp(i-1).V) иногда
дают не совсем правильный результат, а именно - не везде
группирует по полю V, т.е. может выйти две строки с одинаковым
значением поля V. Есть ли ОБЪЕКТИВНО правильная схема связи
в подобных запросах ?
3. Интересны любые соображения и рассуждения по данному примеру либо
по сходному.


Благодарен за любой ответ.

Валентин.
...
Рейтинг: 0 / 0
FULL JOIN
    #32018994
Valk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеем следующие Stored Procedures (схематично основная структура):
- StoredProc1(p1, p2) returns (V, x1, x2):
begin
for Select *
from Table1
where Field1=p1 and Field2=p2
end;
- StoredProc2 (p1, p2) returns (V, y1, y2) - тоже самое, только для Table2
- StoredProc3 (p1, p2) returns (V, z1, z2) - тоже самое, только для Table3
- StoredProc4 (p1, p2) returns (V, q1, q2) - тоже самое, только для Table4

Таким образом, каждая из процедур возвращает определенное подмножество из
соответствующих таблиц.
Мне необходимо получить множество записей такой
структуры:
V , x1, x2, y1, y2, z1, z2, q1, q2 (РезМножество)
т.е. необходимо состыковать множества, возвращаемые процедурами по полю V,
при этом "стыкуемость" этих множеств по полю V заранее не известна,
т.е. (РезМножество) может иметь вид:
1, x11 , x21 , y11 , y21 , z11 , z21 , q11 , q21
2, null , null , y12 , y22 , z11 , z21 , null , null
3, x12 , x22 , y13 , y23 , null , null , null , null
и т.п.

Напрашивается использование FULL JOIN:
SELECT * FROM
StoredProc1 sp1
FULL JOIN StoredProc2 sp2 ON (sp2.V=sp1.V) (**)
FULL JOIN StoredProc3 sp3 ON (sp3.V=sp1.V)
FULL JOIN StoredProc4 sp4 ON (sp4.V=sp1.V)

При этом предположим, что в частном случае
StoredProc1 возвращает 3 строки;
StoredProc2 - 3 строки;
StoredProc3 - 2 строки;
StoredProc4 - 3 строки.

QuickDesk 2.0 показывает:
+--------------------------+-------+
|........Table Name........|.Index |
|..........................|.reads |
+--------------------------+-------+
|..RDB$PROCEDURE_PARAMETERS|____12 |
|....................TABLE2|___144 |
|....................TABLE3|____32 |
|....................TABLE4|____12 |
|....................TABLE1|___144 |
|..RDB$RELATION_CONSTRAINTS|_____0 |
+--------------------------+-------+
При этом результат выдается правильный.
Расстановка дополнительных скобок в запросе ничего не меняет.

Если, же создать две промежуточные процедуры:
- StoredProcX:
begin
for Select * from
StoredProc1 sp1
FULL JOIN StoredProc2 sp2 ON (sp2.V=sp1.V)
end

- StoredProcY:
begin
for Select * from
StoredProc3 sp3
FULL JOIN StoredProc4 sp4 ON (sp4.V=sp3.V)
end

А потом:
SELECT * FROM
StoredProcX spX
FULL JOIN StoredProcY spY ON (spX.V=spY.V) (***)

QuickDesk 2.0 показывает: (!)
+--------------------------+-------+
|........Table Name........|.Index |
|..........................|.reads |
+--------------------------+-------+
|..RDB$PROCEDURE_PARAMETERS|_____8 |
|....................TABLE2|____48 |
|....................TABLE3|____20 |
|....................TABLE4|____18 |
|....................TABLE1|____48 |
|..RDB$RELATION_CONSTRAINTS|_____0 |
+--------------------------+-------+
При этом результат - тот же
***********************************************
ХОТЕЛОСЬ БЫ ВЫЯСНИТЬ:
1. Нельзя ли как-то еще оптимизировать запрос (**) ?
2. В запросе (**) раздел ON имеет вид (sp(i).V=sp1.V),
другие варианты, например, (sp(i).V=sp(i-1).V) иногда
дают не совсем правильный результат, а именно - не везде
группирует по полю V, т.е. может выйти две строки с одинаковым
значением поля V. Есть ли ОБЪЕКТИВНО правильная схема связи
в подобных запросах ?
3. Интересны любые соображения и рассуждения по данному примеру либо
по сходному.


Благодарен за любой ответ.

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


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