环境: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),其中包含一个具有一个附加非唯一属性(RPQ ID)的新客户端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 ...
对于只有几列的表格来说这是合理的,但我希望有人有一个更优雅的解决方案。
谢谢!
答案 0 :(得分: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
列表中的适当位置。