迭代值插入......或其他方式? SQL Server

时间:2017-07-21 09:10:18

标签: sql sql-server tsql sql-insert

Addtional Question: 我不能在INSERT语句中对ETL.Dim_Status进行别名...所以这让我相信插入和select / from / leftjoin / where是两个独立的语句......所以为什么我不能把插入放在所有的东西下面??

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

我选择一个子查询?...那么为什么它不在括号中?

因此,如果我尝试运行它,那么我会收到一个错误,告诉我Sub-Query返回了多个值。我知道这一点,我需要插入所有这些值。

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

   );

2 个答案:

答案 0 :(得分:3)

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

更新 - 如果您尝试添加来自Invitee的状态,这些状态尚未包含在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

答案 1 :(得分:2)

只需删除values关键字,sql操作就是设置操作。 它是标准的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