数据库表分区名称是否可以用作IBM DB2 9.7 SELECT语句的WHERE子句的一部分?

时间:2016-02-16 18:12:30

标签: db2 data-partitioning

我正在尝试使用DB2 EXPORT实用程序从100多个表的同一特定表分区中选择所有数据。分区名称在我的所有分区表中都是常量,这使得此方法比使用其他一些可能的方法更有优势。

我无法分区,因为它们在生产环境中。

为了将其编写为半自动化脚本,我需要能够运行查询:

SELECT * FROM MYTABLE 
WHERE PARTITION_NAME = MYPARTITION;

我无法在传递给EXPORT实用程序的SELECT语句中找到使用此类逻辑的正确语法。

提前致谢。 约翰

1 个答案:

答案 0 :(得分:1)

您可以通过首先查找分区数字来执行此类操作:

SELECT SEQNO 
FROM SYSCAT.DATAPARTITIONS
WHERE TABNAME = 'YOURTABLE' AND DATAPARTITIONNAME = 'WHATEVER'

然后在查询中使用SEQNO值:

SELECT * FROM MYTABLE 
WHERE DATAPARTITIONNUM(anycolumn) = <SEQNO value>

修改

由于您在DATAPARTITIONNUM()中引用的列无关紧要,并且由于每个表都保证至少有一列,因此您可以通过加入SYSCAT.DATAPARTITIONSSYSCAT.COLUMNS自动生成查询:

select 
  'select * from', p.tabname, 
  'where datapartitionnum(', colname, ') = ', seqno 
from syscat.datapartitions p 
inner join syscat.columns c 
  on p.tabschema = c.tabschema and p.tabname = c.tabname
where colno = 1 
and   datapartitionname = '<your partition name>' 
and   p.tabname in (<your table list>)

但是,在我看来,在您的应用程序中构建对数据库元数据的依赖性并不是非常可靠。您可以简单地指定适当的分区键范围来提取数据,这将是有效的。