环境: INFORMIX 9.50C1,AIX6.1
与我试图做的最接近的类比是邮件合并。下面是一个场景:
一个表(客户端)有大量的列(72列)。表包含客户端数据,列表示客户端的各种属性。
CLIENT_ID RPQ_ID Attrib2 Attrib3 ... Attrib71表中唯一的键是client id: CLIENT_ID,它是一个12个字符的字母数字字段。所有其他列都允许重复。
客户端表中的一行被设置为新客户端集的模板。
CLIENT_ID RPQ_ID Attrib2 Attrib3 ... Attrib71
TEMPLATE_017 000000 London017 CLS12 ... 12我有第二个表(TMP_IMPORT),它包含一个新的客户ID列表,其中包含一个额外的非唯一属性(RPQ )。导入列表有大约2000行。
CLIENT_ID RPQ_ID
GPR3344 HG777
JND4111 JL888
JPS3172 JL888
PAP2171 JL888
...任务是执行相当于邮件合并的操作:使用来自client_id和rpq_id值的TMP_IMPORT和模板行中的所有其他列,将2000年新行添加到客户端表。
表客户端的预期结果是
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脚本、过程和第三方库。
此外,请:没有列的枚举。我看到的常见解决方案之一是连接表并指定每个数据列的源,如
选择TMP_IMPORT.CLIENT_ID,TMP_IMPORT.RPQ_ID,CLIENTS.Attrib2,CLIENTS.Attrib3,.,CLIENTS.Attrib71从TMP_IMPORT,客户.
对于一个只有几列的表来说,这是合理的,但我希望有人有一个更优雅的解决方案。
谢谢!
发布于 2013-07-27 11:31:04
您似乎知道您想要的查询:
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列表中的适当位置。
https://stackoverflow.com/questions/17895631
复制相似问题