如何在SQL中应用来自另一个表的数据时创建数据行的多个副本

时间:2013-07-27 07:59:30

标签: sql email merge duplicates informix

环境: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 ...

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

谢谢!

1 个答案:

答案 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列表中的适当位置。