将一个表中的多行数据插入到另一个表的列中:SQL在两个表之间执行数据插入操作

3
我们有一张公司详细信息的表和另一张与这些公司相关联的联系人表,因此每个公司可以有多个联系人。有人将浏览联系人表并将每个公司的联系人减少到2个。
然后,他们需要创建一张包含联系人表中每个联系人的公司详细信息表,添加在列末端,例如[Contact1Name],[Contact1Tel],[Contact2Name],[Contact2Tel]。
为了将所有信息放入一个表格/电子表格中,是否可以通过tsql自动完成此操作,还是必须手动完成?
每个联系人都通过公司ID列链接到公司。
感谢任何帮助。
3个回答

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
我来自甲骨文背景,但我喜欢这个美丽的解决方案。
按照COMPANY_IDCONTACTS中的记录进行排序,为每个记录分配一个唯一的编号,找到分配给每个公司的最小和最大编号,然后选择它们对应的两个记录:
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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接