【问题标题】:SQL insert multiple rows from one table into columns on another tableSQL 将一张表中的多行插入到另一张表的列中
【发布时间】:2013-12-15 12:30:00
【问题描述】:

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

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

为了让他们在一个表格/电子表格中拥有所有信息,有没有办法通过 tsql 自动执行此操作,还是必须手动完成?

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

感谢您的帮助。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案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)的数据

    【讨论】:

      【解决方案2】:

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

      CONTACTS中的记录按COMPANY_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
      

      【讨论】:

        【解决方案3】:

        您所做的称为非规范化。这可能是一件好事(它肯定使编写查询更容易。)

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

        ; 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多