|
FULL JOIN
|
|||
---|---|---|---|
#18+
Имеем следующие 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. Интересны любые соображения и рассуждения по данному примеру либо по сходному. Благодарен за любой ответ. Валентин. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2001, 13:45 |
|
FULL JOIN
|
|||
---|---|---|---|
#18+
Имеем следующие 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. Интересны любые соображения и рассуждения по данному примеру либо по сходному. Благодарен за любой ответ. Валентин. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2001, 13:46 |
|
|
start [/forum/topic.php?fid=40&msg=32018993&tid=1581301]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 132ms |
0 / 0 |