Sql 如何在IBMDB2中获得这个结果?

Sql 如何在IBMDB2中获得这个结果?,sql,db2,Sql,Db2,例如,我有两个模式:SCHEMA_1和SCHEMA_2。在SHEMA_1中,我有一个名为table的表。此表包括两个字段:字段_1、字段_2。在字段_1的表中,我有一些字母:A、B、C。字段_2有模式2的表名:表_10、表_20、表_30 模式_2包括三个表:表_10、表_20、表_30和一些数字。 我必须编写查询以获得模式2中每个表的最大数量。如何获得此结果> 试试这个: create table schema1.tableA (field_1 char(1), field_

例如,我有两个模式:SCHEMA_1SCHEMA_2。在SHEMA_1中,我有一个名为table的表。此表包括两个字段:字段_1、字段_2。在字段_1的表中,我有一些字母:A、B、C。字段_2有模式2的表名:表_10、表_20、表_30

模式_2包括三个表:表_10、表_20、表_30和一些数字。

我必须编写查询以获得模式2中每个表的最大数量。如何获得此结果> 试试这个:

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;
如果有太多的表无法完成上述工作,则可以使用如下用户定义的函数:

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;
set schema schema1;
set path = udf_schema;

select field_1, MaxNbr(field_2, 'schema2') as field_2
  from tableA;
这是必要的,因为不能将变量用作表名或架构名之类的标识符

要使用用户定义的函数,可以执行以下操作:

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;
set schema schema1;
set path = udf_schema;

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

谢谢但是,如果SCHEMA_2包含3个以上的表,我该怎么办?例如,50个具有相同字段的表。您必须编写一个自定义项才能从表中获取数量。不幸的是,没有办法将表名编码为变量。请确保防止注入。