2017-08-10 2 views
-3

Zum Beispiel ein Ich habe zwei Schemas: SCHEMA_1 und SCHEMA_2. In SHEMA_1 Ich habe eine Tabelle mit dem Namen TABELLE. Diese Tabelle enthält zwei Felder: FIELD_1, FIELD_2. In TABELLE in FIELD_1 habe ich einige Buchstaben: A, B, C. FIELD_2 hat Tabellennamen von SCHEMA 2: TABELLE_10, TABELLE_20, TABELLE_30.Wie kann ich dieses Ergebnis in IBM DB2 erhalten?

SCHEMA_2 enthält drei Tabellen: TABLE_10, TABLE_20, TABLE_30 mit einigen Zahlen. enter image description here

Ich muss Abfrage schreiben, um die maximale Anzahl jeder Tabelle in SCHEMA_2 zu erhalten. Wie kann ich dieses Ergebnis zu erhalten> enter image description here

Antwort

0

Try this:

create table schema1.tableA 
    (field_1 char(1), 
    field_2 varchar(10)); 
insert into schema1.tableA 
    values ('A','table_10'), 
     ('B','table_20'), 
     ('C','table_30'); 

create table schema2.table_10 
    (field_1 dec(5,0)); 
insert into schema2.table_10 
    values (20), (30), (40); 
create table schema2.table_20 
    (field_1 dec(5,0)); 
insert into schema2.table_20 
    values (6), (9), (12); 
create table schema2.table_30 
    (field_1 dec(5,0)); 
insert into schema2.table_30 
    values (10), (15), (20); 

with tmp (table_name, field_1) as (
    select 'table_10', max(field_1) from schema2.table_10 
    union all 
    select 'table_20', max(field_1) from schema2.table_20 
    union all 
    select 'table_30', max(field_1) from schema2.table_30) 
select a.field_1, b.field_1 
    from schema1.tableA a 
    join tmp b on b.table_name = a.field_2; 

Wenn Sie zu viele Tabellen haben die oben genannten Arbeiten zu machen, können Sie eine benutzerdefinierte Funktion wie folgt verwendet werden:

create or replace function MaxNbr 
    (p_TableName  varchar(128), 
    p_TableSchema varchar(128)) 
    Returns dec(5,0) 
    language sql 
    not deterministic 
    no external action 
    reads sql data 
    returns null on null input 
    not fenced 
begin 
    declare l_stmt  varchar(1024); 
    declare l_table varchar(128); 
    declare l_schema varchar(128); 
    declare l_result dec(5,0); 

    set l_table = replace(upper(p_TableName),'"',''); 
    set l_schema = replace(upper(p_TableSchema),'"',''); 
    set l_stmt = 'values (select max(field_1) from "' || l_schema || '"."' || 
       trim(l_table) || '") into ?'; 

    prepare S1 from l_stmt; 
    allocate sql descriptor 'D1'; 
    describe S1 using sql descriptor 'D1'; 
    execute S1 into sql descriptor 'D1'; 
    get sql descriptor 'D1' value 1 l_result = data; 
    deallocate sql descriptor 'D1'; 

    return l_result; 
end; 

Dies ist erforderlich, da Sie eine Variable nicht für einen Bezeichner wie einen Tabellennamen oder einen Schemanamen verwenden können.

Um die benutzerdefinierte Funktion zu verwenden, können Sie etwas tun:

set schema schema1; 
set path = udf_schema; 

select field_1, MaxNbr(field_2, 'schema2') as field_2 
    from tableA; 
+0

Dank. Aber was kann ich tun, wenn SCHEMA_2 mehr als 3 Tabellen enthält? Zum Beispiel 50 Tabellen mit demselben Feld. – Asset

+0

Sie müssen eine UDF schreiben, um die Menge aus einer Tabelle zu erhalten. Leider gibt es keine Möglichkeit, einen Tabellennamen als Variable zu codieren. – jmarkmurphy

+0

Stellen Sie sicher, dass Sie vor einer Injektion schützen. – jmarkmurphy