【问题标题】:How to insert data in multiple rows of temp tables in sql如何在sql的多行临时表中插入数据
【发布时间】:2018-06-19 09:06:12
【问题描述】:

我如何在同一行中插入例如,我想在第一行中插入所有这些列数据,然后在第二行中插入,依此类推。但是我的查询是在客户姓名数据完成时插入数据,状态数据是在客户编号最后一行数据之后插入的。

  CREATE TABLE #tblCustomer 
             (
               CustomerNumber  NVARCHAR(1000),
               Status NVARCHAR (1000),
               CustomerType NVARCHAR (1000)
              )


          INSERT 
            INTO #tblCustomer (CustomerNumber)
          Select c.CustomerNumber 
            From Customer.Customer c
          INSERT 
            INTO #tblCustomer (Status) 
          Select ses.Name 
            From Customer.Customer c 
  Left Outer Join COM.StatusEngine_EntityStatus sees 
               On c.Status = sees.EntityStatusId 
              And sees.EntityId = 'CustomerStatus' 
             Join COM.StatusEngine_Status ses 
               On sees.Status = ses.Status
           INSERT 
             INTO #tblCustomer (CustomerType) 
           select t.Description 
             From Customer.Customer c 
             Join Customer.Type t 
               On c.TypeId = t.pkTypeId

接收输出:

  0001 null   null
  0002 null   null
  NULL active null
  NULL active null
  NULL null  individual
  NULL null  individual

预期输出:

 0001 active individual
 0002 active individual

【问题讨论】:

  • 为什么不使用一个插入来全选?
  • @HoneyBadger 我已经尝试过,但我不确定是否可以将它用于多个查询
  • 您不需要多个查询,只需要一个查询所有属性。只需从 Customer.Customer 中选择一个即可,包含您需要的所有连接。

标签: sql sql-server tsql temp-tables


【解决方案1】:

在不了解表的情况下,您可以像这样插入第一条记录...

INSERT INTO #tblCustomer (CustomerNumber)
select  c.CustomerNumber from Customer.Customer c

然后以这种方式更新剩余的列...

UPDATE #tblCustomer 
    set #tblCustomer.Status = c.Status
from Customer.Customer c 
left outer join COM.StatusEngine_EntityStatus sees
    on c.Status = sees.EntityStatusId and sees.EntityId = 'CustomerStatus'
join COM.StatusEngine_Status ses
    on sees.Status = ses.Status
join #tblCustomer temp
    on c.CustomerNumber = temp.CustomerNumber

但是这样做确实效率很低,您应该努力创建一个一次性更新所有列的插入。

【讨论】:

    【解决方案2】:

    您可以这样做(我已经使用 Microsoft 的 Northwind 示例数据库验证了代码 - 我选择了那个,因为您可以将它用于自 SQL 2000 以来的每个 SQL 服务器版本):

    declare @NumberOfItems int = 10;
    
    CREATE TABLE #tblCustomer (
         CustomerNumber  NVARCHAR(1000)
        ,Name NVARCHAR (1000)
        ,CustomerType NVARCHAR (1000))
    
    insert into #tblCustomer
    select CustomerNumber, Name, Status from (select top(@NumberOfItems) ROW_NUMBER() OVER(ORDER BY CustomerID) as No, CustomerID as CustomerNumber from Customers) c
    left join (select * from (select top(@NumberOfItems) ROW_NUMBER() OVER(ORDER BY ContactName) as No, ContactName as Name from Customers) q2) j1 on c.No=j1.No
    left join (select * from (select top(@NumberOfItems) ROW_NUMBER() OVER(ORDER BY ContactTitle) as No, ContactTitle as Status from Customers) q3) j2 on c.No=j2.No
    
    select * from #tblCustomer
    drop table #tblCustomer
    

    它将为您要导入的每个元素创建一个从 1 到 n 的数字列,然后将其连接在一起。

    这个查询的结果是:

    注意:虽然这可行,但它不是首选方式,因为没有主键 - 通常人们会寻找主键/外键关系来将数据连接在一起。

    您打算填充它的方式将不一定属于一起的数据放在一起(这里对每一列进行排序,然后按其行号放在一起 - 即它从按其提取排序的行中选择值列,然后将它们再次放在一起)。

    如果您因为从其他来源导入数据而没有主键,则可以添加 WHERE 子句以在内部和外部 select 语句之间创建更好的连接 - 您可以找到一篇不错的文章可能会帮助您处理此类子查询 here

    【讨论】:

      【解决方案3】:

      这是未经测试的,但是,我相信这就是您所追求的:

      INSERT INTO #tblCustomer (CustomerNumber, [Status], CustomerType))
      SELECT  c.CustomerNumber, ses.[Name], t.[Description]
      FROM Customer.Customer c
           JOIN COM.StatusEngine_EntityStatus sees ON c.Status = sees.EntityStatusId --Changed to JOIN, as it is turned into a implicit INNER join by the next JOIN
                                                  AND sees.EntityId = 'CustomerStatus'
           JOIN COM.StatusEngine_Status ses ON sees.[Status] = ses.[Status];
      

      请注意我对您的 LEFT OUTER JOIN 的评论,因为我已将其更改为 INNER JOIN

      【讨论】:

      • 这个要求我自己不会改
      • 有什么要求?
      • 我有多个列,这三个仅用于演示。1.使用'左外连接 COM.StatusEngine_EntityStatus 看到 c.Status = sees.EntityStatusId 和 sees.EntityId ='CustomerStatus' 加入 COM.StatusEngine_Status ses on sees.Status = ses.Status' 2. 使用'join Customer.Type t on c.TypeId = t.pkTypeId'
      • 我对您的LEFT OUTER JOIN 的评论没有改变。如果您在后一张表上有一个JOIN,它依赖于之前的LEFT OUTER JOIN,而不检查NULL,那么LEFT OUTER JOIN 将成为一个隐含的INNER JOIN。 “要求”不会改变这一点,这是事实,使用正确的连接,您(可能)会获得更好的性能。
      【解决方案4】:

      这里是直截了当的 SQL:

      CREATE TABLE #tblCustomer 
      (
          CustomerNumber  NVARCHAR(1000),
          Status NVARCHAR (1000),
          CustomerType NVARCHAR (1000)
      )
      
      INSERT INTO #tblCustomer (CustomerNumber, Status, CustomerType)
      SELECT DISTINCT 
           c.CustomerNumber, 
           ses.Name, 
           t.Description  
      FROM Customer.Customer c
      LEFT OUTER JOIN COM.StatusEngine_EntityStatus sees 
          On c.Status = sees.EntityStatusId 
          And sees.EntityId = 'CustomerStatus' 
      LEFT OUTER JOIN COM.StatusEngine_Status ses 
          On sees.Status = ses.Status
      LEFT OUTER JOIN Customer.Type t 
          On c.TypeId = t.pkTypeId
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 2020-03-16
        • 2016-07-17
        • 2017-04-02
        相关资源
        最近更新 更多