1

环境:INFORMIX 9.50C1、AIX 6.1

与我正在尝试做的最接近的类比是邮件合并。这是场景:

一个表 (CLIENTS) 有大量列(72 列)。该表包含客户数据,列代表客户的各种属性。

CLIENT_ID     RPQ_ID    Attrib2     Attrib3 ... Attrib71

表上的唯一键是客户端 ID:CLIENT_ID,它是一个 12 个字符的字母数字字段。所有其他列都允许重复。

CLIENTS 表中的一行被设置为一组新客户端的模板。

CLIENT_ID     RPQ_ID    Attrib2     Attrib3 ... Attrib71
TEMPLATE_017  000000    London017   CLS12   ... 12

我有第二个表(TMP_IMPORT),其中包含一个新的客户端 ID 列表以及一个额外的非唯一属性(RPQ ID)。导入列表有 ~2000 行。

CLIENT_ID     RPQ_ID
GPR3344       HG777
JND4111       JL888
JPS3172       JL888
PAP2171       JL888
...

任务是执行邮件合并的等效操作:使用来自 TMP_IMPORT 的 client_id 和 rpq_id 值以及来自模板行的所有其他列,将 2000 个新行添加到 CLIENTS 表中。

表 CLIENTS 中的预期结果是

CLIENT_ID     RPQ_ID   Attrib2     Attrib3 ... Attrib71
TEMPLATE_017  000000   London017   CLS12   ... 12
GPR3344       HG777    London017   CLS12   ... 12
JND4111       JL888    London017   CLS12   ... 12
JPS3172       JL888    London017   CLS12   ... 12
PAP2171       JL888    London017   CLS12   ... 12
...

这一切都发生在一个大公司内,就访问控制、执行权限等而言,灵活性很小。解决方案必须使用直接的 SQL,没有 shell 脚本、过程和第三方库。

另外,请:不要枚举列。我见过的常见解决方案之一是连接表并指定每个数据列的来源,如

select TMP_IMPORT.CLIENT_ID, 
         TMP_IMPORT.RPQ_ID, 
         CLIENTS.Attrib2, 
         CLIENTS.Attrib3, 
         ..., 
         CLIENTS.Attrib71
from TMP_IMPORT, CLIENTS ...

这对于只有几列的表来说是合理的,但我希望有人有一个更优雅的解决方案。

谢谢!

4

1 回答 1

1

您似乎知道您想要的查询:

insert into clients(client_id, rpt_id, . . . , Attrib71)
    select ti.CLIENT_ID, ti.RPQ_ID, c.Attrib2, c.Attrib3, ..., CLIENTS.Attrib71
    from TMP_IMPORT ti cross join
         (select c.*
          from CLIENTS c
          where client_id = 'Template_017'
         ) c;

您的问题似乎是获取列名列表。获取列的最简单方法如下:

select colname
from syscolumns c join
     systables t
     on c.tabid = t.tabid and t.tabname = 'CLIENTS'
order by colno;

事实上,你可以这样做:

select colname || ', '

然后将结果复制到您的查询编辑器中的列列表中insert(并删除最后的逗号)。然后将它们也复制到select列表中的适当位置。

于 2013-07-27T11:31:04.047 回答