Можно ли сделать такое одним запросом
От: Аноним  
Дата: 13.01.05 12:50
Оценка:
Пример немного утрирован. Если вам покажеться, что он не соответствует практике, то это ничего.


Есть покупатель. К покупателю могут быть привязаны

1) счета
2) платежи

В таблицах счета и платежи есть ссылка на покупателя.

нужно вывести так

Покупатель Счет Платеж

Пример

Петров СН1 ПЛ1
Петров СН2
Петров СН3

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

Например 1 Петрова 3 счета и 1 платеж нужно вывести 3 строчки. Если у петрова 3 счета и 4 платежа, то нужно вывести 4 строки.
Re: Можно ли сделать такое одним запросом
От: MasterSav  
Дата: 13.01.05 13:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пример немного утрирован. Если вам покажеться, что он не соответствует практике, то это ничего.



select *
from pok, sch, pla
where pok.id_sch = sch.id(+)
  and pok.id_pla = pla.id(+)



или


select *
from sch left outer join pok on pok.id_sch = sch.id
         right outer join pla on pok.id_pla = pla.id
Re: Можно ли сделать такое одним запросом
От: Softwarer http://softwarer.ru
Дата: 13.01.05 13:25
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

Можно. Для примера я выведу к таблицам столбцы "числовых полей" и строковых полей

SQL> ed
Wrote file afiedt.buf

  1  with
  2    number_columns as (
  3      select owner, table_name, column_name, 
  4        row_number() over (partition by table_name order by column_name) col_number
  5      from dba_tab_columns
  6      where data_type = 'NUMBER' and table_name in ( 'DBA_USERS', 'DBA_OBJECTS' )),
  7    string_columns as (
  8      select owner, table_name, column_name, 
  9        row_number() over (partition by table_name order by column_name) col_number
 10      from dba_tab_columns
 11      where data_type = 'VARCHAR2' and table_name in ( 'DBA_USERS', 'DBA_OBJECTS' ))
 12  select
 13    coalesce ( nc.table_name, sc.table_name ) "table:",
 14    nc.column_name "number fields:",
 15    sc.column_name "string fields:"
 16  from
 17    number_columns nc full outer join string_columns sc
 18    on ( nc.table_name = sc.table_name and nc.owner = sc.owner and
 19         nc.col_number = sc.col_number )
 20* order by 1, 2, 3
SQL> /

table:               number fields:       string fields:                        
-------------------- -------------------- --------------------                  
DBA_OBJECTS          DATA_OBJECT_ID       GENERATED                             
DBA_OBJECTS          OBJECT_ID            OBJECT_NAME                           
DBA_OBJECTS                               OBJECT_TYPE                           
DBA_OBJECTS                               OWNER                                 
DBA_OBJECTS                               SECONDARY                             
DBA_OBJECTS                               STATUS                                
DBA_OBJECTS                               SUBOBJECT_NAME                        
DBA_OBJECTS                               TEMPORARY                             
DBA_OBJECTS                               TIMESTAMP                             
DBA_USERS            USER_ID              ACCOUNT_STATUS                        
DBA_USERS                                 DEFAULT_TABLESPACE                    
DBA_USERS                                 EXTERNAL_NAME                         
DBA_USERS                                 INITIAL_RSRC_CONSUME                  
DBA_USERS                                 PASSWORD                              
DBA_USERS                                 PROFILE                               
DBA_USERS                                 TEMPORARY_TABLESPACE                  
DBA_USERS                                 USERNAME                              

17 rows selected.
Re[2]: Можно ли сделать такое одним запросом
От: Softwarer http://softwarer.ru
Дата: 13.01.05 13:27
Оценка:
Здравствуйте, MasterSav, Вы писали:

MS>select *

MS>from pok, sch, pla
MS>where pok.id_sch = sch.id(+)
MS> and pok.id_pla = pla.id(+)

Вы здесь организовали картезиан между sch и pla. То есть если у покупателя четыре счета и три платежа — этот запрос вернет двенадцать строк.
Re[2]: Можно ли сделать такое одним запросом
От: Аноним  
Дата: 14.01.05 08:05
Оценка:
Здравствуйте, Softwarer, Вы писали:


S>Можно. Для примера я выведу к таблицам столбцы "числовых полей" и строковых полей


КРУТО!!!
А если будет не 2 а 5 таблиц такое можно сделать??
Re[3]: Можно ли сделать такое одним запросом
От: Softwarer http://softwarer.ru
Дата: 14.01.05 09:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А если будет не 2 а 5 таблиц такое можно сделать??


Да собственно нет особой разницы

SQL> with
  2    tables_list as (
  3      select owner, view_name table_name from dba_views
  4      where view_name in ( 'MVIEW_WORKLOAD', 'USER_TAB_COLUMNS', 'KU$_COLUMN_VIEW' )),
  5    number_columns as (
  6      select tc.owner, tc.table_name, column_name,
  7        row_number() over (partition by tc.table_name order by column_name) col_number
  8      from dba_tab_columns tc, tables_list tl
  9      where data_type = 'NUMBER' and tc.owner = tl.owner and tc.table_name = tl.table_name ),
 10    string_columns as (
 11      select tc.owner, tc.table_name, column_name,
 12        row_number() over (partition by tc.table_name order by column_name) col_number
 13      from dba_tab_columns tc, tables_list tl
 14      where data_type = 'VARCHAR2' and tc.owner = tl.owner and tc.table_name = tl.table_name ),
 15    date_columns as (
 16      select tc.owner, tc.table_name, column_name,
 17        row_number() over (partition by tc.table_name order by column_name) col_number
 18      from dba_tab_columns tc, tables_list tl
 19      where data_type = 'DATE' and tc.owner = tl.owner and tc.table_name = tl.table_name),
 20    other_columns as (
 21      select tc.owner, tc.table_name, column_name, data_type,
 22        row_number() over (partition by tc.table_name order by column_name) col_number
 23      from dba_tab_columns tc, tables_list tl
 24      where data_type not in ( 'DATE', 'NUMBER', 'VARCHAR2' ) and tc.owner = tl.owner and tc.table_name = tl.table_name )
 25  select
 26    case when length ( s."number fields:" || s."string fields:" || s."date fields:" || s."other fields:" ) > 0
 27      then s."table:"
 28      else '- - - - - - - -'
 29      end "table:",
 30    s."number fields:", s."string fields:", s."date fields:", s."other fields:"
 31  from (
 32    select
 33      coalesce ( nc.table_name, sc.table_name, dc.table_name, oc.table_name ) "table:",
 34      nc.column_name "number fields:",
 35      sc.column_name "string fields:",
 36      dc.column_name "date fields:",
 37      case when oc.column_name is not null
 38        then oc.column_name || ' (' || oc.data_type || ')'
 39        else null
 40        end "other fields:"
 41    from
 42      number_columns nc full outer join string_columns sc
 43        on ( nc.table_name = sc.table_name and nc.owner = sc.owner and
 44             nc.col_number = sc.col_number )
 45      full outer join date_columns dc
 46        on ( nc.table_name = dc.table_name and nc.owner = dc.owner and
 47             nc.col_number = dc.col_number )
 48      full outer join other_columns oc
 49        on ( nc.table_name = oc.table_name and nc.owner = oc.owner and
 50             nc.col_number = oc.col_number )
 51    order by 1, 2, 3, 4, 5 ) s
 52  group by grouping sets (
 53    (s."table:", s."number fields:", s."string fields:", s."date fields:", s."other fields:"),
 54    (s."table:"))
 55  order by s."table:"
 56  /

table:               number fields:       string fields:       date fields:         other fields:
-------------------- -------------------- -------------------- -------------------- -------------------------
KU$_COLUMN_VIEW      CHARSETFORM          ATTRNAME             SPARE6               CON (KU$_CONSTRAINT0_T)
KU$_COLUMN_VIEW      CHARSETID            DEFAULT_VAL                               LOBMD (KU$_LOB_T)
KU$_COLUMN_VIEW      COL_NUM              NAME                                      OIDINDEX (KU$_OIDINDEX_T)
KU$_COLUMN_VIEW      DEFLENGTH            SPARE4                                    OPQMD (KU$_OPQTYPE_T)
KU$_COLUMN_VIEW      FIXEDSTORAGE         SPARE5                                    TYPEMD (KU$_COLTYPE_T)
KU$_COLUMN_VIEW      INTCOL_NUM                                                     
KU$_COLUMN_VIEW      IS_NULL                                                        
KU$_COLUMN_VIEW      LENGTH                                                         
KU$_COLUMN_VIEW      OBJ_NUM                                                        
KU$_COLUMN_VIEW      OFFSET                                                         
KU$_COLUMN_VIEW      PRECISION_NUM                                                  
KU$_COLUMN_VIEW      PROPERTY                                                       
KU$_COLUMN_VIEW      SCALE                                                          
KU$_COLUMN_VIEW      SEGCOLLENGTH                                                   
KU$_COLUMN_VIEW      SEGCOL_NUM                                                     
KU$_COLUMN_VIEW      SPARE1                                                         
KU$_COLUMN_VIEW      SPARE2                                                         
KU$_COLUMN_VIEW      SPARE3                                                         
KU$_COLUMN_VIEW      TYPE_NUM                                                       
- - - - - - - -                                                                     
MVIEW_WORKLOAD       CARDINALITY          APPLICATION          IMPORT_TIME          QUERY (LONG)
MVIEW_WORKLOAD       FREQUENCY            OWNER                LASTUSE              
MVIEW_WORKLOAD       PRIORITY                                                       
MVIEW_WORKLOAD       QUERYID                                                        
MVIEW_WORKLOAD       RESPONSETIME                                                   
MVIEW_WORKLOAD       RESULTSIZE                                                     
MVIEW_WORKLOAD       WORKLOADID                                                     
- - - - - - - -                                                                     
USER_TAB_COLUMNS     AVG_COL_LEN          CHARACTER_SET_NAME   LAST_ANALYZED        DATA_DEFAULT (LONG)
USER_TAB_COLUMNS     CHAR_COL_DECL_LENGTH CHAR_USED                                 HIGH_VALUE (RAW)
USER_TAB_COLUMNS     CHAR_LENGTH          COLUMN_NAME                               LOW_VALUE (RAW)
USER_TAB_COLUMNS     COLUMN_ID            DATA_TYPE                                 
USER_TAB_COLUMNS     DATA_LENGTH          DATA_TYPE_MOD                             
USER_TAB_COLUMNS     DATA_PRECISION       DATA_TYPE_OWNER                           
USER_TAB_COLUMNS     DATA_SCALE           DATA_UPGRADED                             
USER_TAB_COLUMNS     DEFAULT_LENGTH       GLOBAL_STATS                              
USER_TAB_COLUMNS     DENSITY              NULLABLE                                  
USER_TAB_COLUMNS     NUM_BUCKETS          TABLE_NAME                                
USER_TAB_COLUMNS     NUM_DISTINCT         USER_STATS                                
USER_TAB_COLUMNS     NUM_NULLS            V80_FMT_IMAGE                             
USER_TAB_COLUMNS     SAMPLE_SIZE                                                    
- - - - - - - -                                                                     

42 rows selected
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.