【问题标题】:Iterating through values to insert... or another way? SQL Server遍历值以插入...或其他方式? SQL 服务器
【发布时间】:2017-07-21 09:10:18
【问题描述】:

其他问题: 我不能在 INSERT 语句中为 ETL.Dim_Status 加上别名……所以这让我相信插入和 select/from/leftjoin/where 是两个独立的语句……那么为什么我不能将插入插入到所有内容的下方??

它们是两个独立的语句还是一个?如果它们是一个,那为什么我不能在插入部分中使用别名?

我选择了一个子查询?...那为什么不在括号里呢?


因此,如果我尝试运行此程序,则会收到一条错误消息,告诉我子查询返回了多个值。我知道这一点,我需要插入所有这些值。

INSERT INTO ETL.Dim_Status ([Status]) 
VALUES(
          --- I need to iterate through each of the new distinct values 

            (
            SELECT DISTINCT 
                I.[Status] 
            FROM 
                dbo.Invitee I
            LEFT JOIN
                ETL.Dim_Status S
                ON  I.[Status] = S.[Status]
            WHERE 
                S.[Status] IS NULL
            )

   );

我可以将其设为基于集合的操作,而不是逐行插入值吗?

我试过游标,但我什至不知道我是否把所有东西都放在了正确的位置:

  DECLARE insertNewStatus CURSOR    
  INSERT INTO ETL.Dim_Status ([Status]) 
  VALUES(
      --- I need to iterate through each of the distinct values 
          FOR
             ( 
             SELECT DISTINCT 
                I.[Status] 
             FROM 
                dbo.Invitee I
             LEFT JOIN
                ETL.Dim_Status S
                ON  I.[Status] = S.[Status]
             WHERE 
                S.[Status] IS NULL
             )
         OPEN insertNewStatus
         FETCH NEXT FROM insertNewStatus

   );

【问题讨论】:

  • 在迭代你想要实现的目标之后?您的输入是什么,您使用插入存储的预期输出是什么?大部分场景不需要迭代
  • 第一个是“基于集合的操作”,它将插入 SELECT 语句返回的所有值。你只是语法不正确
  • 我对你实际想要达到的目标有点困惑。但更新了我的答案

标签: sql sql-server tsql sql-insert


【解决方案1】:
INSERT INTO ETL.Dim_Status ([Status])      
SELECT DISTINCT I.[Status] 
FROM dbo.Invitee I
     LEFT JOIN ETL.Dim_Status S ON  I.[Status] = S.[Status]
 WHERE S.[Status] IS NULL

更新 - 如果您尝试添加来自被邀请者的状态,而这些状态尚未在 ETL.Dim_Status 中

   INSERT INTO ETL.Dim_Status ([Status])    
   SELECT DISTINCT [Status] 
   FROM dbo.Invitee 
   WHERE [Status] NOT IN ( SELECT DISTINCT [Status] FROM ETL.Dim_Status)

查看更多关于Adding Rows by Using INSERT and SELECT

【讨论】:

    【解决方案2】:

    只要去掉values关键字,sql操作都是set操作。 这是标准的 SQL 语法。

    INSERT INTO ETL.Dim_Status ([Status]) 
    SELECT DISTINCT 
        I.[Status] 
    FROM 
        dbo.Invitee I
    LEFT JOIN
        ETL.Dim_Status S
        ON  I.[Status] = S.[Status]
    WHERE 
        S.[Status] IS NULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2020-11-04
      • 2014-09-09
      • 1970-01-01
      相关资源
      最近更新 更多