SQL将一个表中的多行插入另一个表的列中

时间:2013-11-29 10:29:21

标签: sql sql-server tsql

我们有一个公司详细信息表和另一个与这些公司相关联的联系人表,因此每个公司可以有很多联系人。有人会通过联系人表格将每家公司的联系人减少到2。

然后,他们需要创建一个公司详细信息表,其中联系人表格中的每个联系人都在列的末尾添加,例如[Contact1Name],[Contact1Tel],[Contact2Name],[Contact2Tel]。

因此,他们将所有信息都放在一个表格/电子表格中,有没有办法通过tsql自动完成,还是必须手动完成?

每个联系人都通过公司ID栏链接到公司。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您可以像这样提取数据:

WITH idList AS
(
    SELECT CompanyID, 
           MIN(ContactID) as id1,
           MAX(ContactId) as id2 
    FROM Contact GROUP BY CompanyID
)
SELECT c.*,c1.*,c2.*
FROM Company c 
INNER JOIN idList ON c.CompanyID = idList.CompanyID
INNER JOIN Contact c1 ON c1.ContactId = idList.id1
INNER JOIN Contact c2 ON c2.ContactId = idList.id2

您将获得公司数据(c)和两个联系人(c1和c2)的数据

答案 1 :(得分:1)

我来自Oracle背景;但我喜欢这个美丽的解决方案。

CONTACTSCOMPANY_ID订购记录,为每条记录分配一个唯一的编号,找到给每家公司的最小和最大编号,然后选择他们的两个相应记录:

WITH T AS
(
  SELECT ROWNUM RN, C.* FROM
          (SELECT CONTACTS.COMPANY_ID, 
                  COMPANY.COMPANY_NAME, 
                  CONTACTS.NAME, 
                  CONTACTS.TEL
           FROM CONTACTS, COMPANY 
           WHERE CONTACTS.COMPANY_ID = COMPANY.COMPANY_ID
           ORDER BY CONTACTS.COMPANY_ID ) C
), R AS 
(
  SELECT COMPANY_NAME, MIN(RN) MINR, MAX(RN) MAXR FROM T 
  GROUP BY COMPANY_NAME
)
SELECT R.COMPANY_NAME, T1.NAME NAME1, T1.TEL TEL1, 
                 T2.NAME NAME2,  T2.TEL TEL2
FROM R, T T1, T T2
WHERE R.MINR = T1.RN and R.MAXR = T2.RN

答案 2 :(得分:0)

你正在做的事情被称为非规范化。这可能是一件好事(它确实使编写查询更容易。)

一种方法是为每个联系人分配一个行号。然后,您可以提取第一个和第二个联系人:

; with  (
        select  row_number() over (partition by CompanyID 
                                   order by ContactName) as rn
        ,       *
        from    OldTable
        ) as numbered_contacts
insert  NewTable
        (CompanyID, ContactName1, ContactTel1, ContactName2, ContactTel2)
select  c1.CompanyID
,       c1.ContactName as ContactName1
,       c1.ContactTel as ContactTel1
,       c2.ContactName as ContactName2
,       c2.ContactTel as ContactTel2
from    numbered_contacts c1
left join
        numbered_contacts c2
on      c1.CompanyID = c2.CompanyID
        and c2.rn = 2 -- Second contact
where   c1.rn = 1 -- Fist contact