Sql 需要有关Merge语句的帮助吗

Sql 需要有关Merge语句的帮助吗,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我想从一个名为Sorels的表更新一个名为Sorels_ext的表。它们之间的链接是Sorels_ext的fkey_id等于Sorels表的identity_列。这是我第一次尝试Merge语句,我正在学习语法 MERGE Sorels_ext AS SORe USING (select SOR.identity_column, CASE WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue' WHEN left(SOR.FPART

我想从一个名为Sorels的表更新一个名为Sorels_ext的表。它们之间的链接是Sorels_ext的fkey_id等于Sorels表的identity_列。这是我第一次尝试Merge语句,我正在学习语法

MERGE Sorels_ext AS SORe
USING (select SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END from Sorels AS SOR)
ON  (SORe.fkey_id = SOR.identity_column)

WHEN MATCHED THEN
  UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = select SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END
WHEN NOT MATCHED THEN
  INSERT (SORe.fkey_id, SORe.Color) VALUES (SOR.identity_column, SORe.Color = select SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END);
当我运行此操作时,会出现以下错误:

错误10/22/2009 1:38:51 PM 0:00:00.000 SQL Server数据库错误:关键字“ON”附近的语法不正确。46 0

***添加信息******

建议进行第一次修复后,代码如下:

    MERGE Sorels_ext AS SORe
USING (select SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END from Sorels) AS SOR
ON  (SORe.fkey_id = SOR.identity_column)

WHEN MATCHED THEN
  UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END
WHEN NOT MATCHED THEN
  INSERT (SORe.fkey_id, SORe.Color) VALUES (SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END);
现在我得到以下错误:

错误10/22/2009 2:03:29 PM 0:00:00.000 SQL Server数据库错误:合并语句中使用的插入列列表不能包含多部分标识符。改用单个零件标识符。55 0

*******添加了更多信息****** 根据建议进行调整后,我有以下几点:

    MERGE Sorels_ext AS SORe
USING (select SOR1.identity_column, CASE
        WHEN left(SOR1.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR1.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END as colors from Sorels as SOR1 ) as SOR 
ON  (SORe.fkey_id = SOR.identity_column)

WHEN MATCHED THEN
  UPDATE SET SORe.fkey_id = SOR.identity_column, SORe.Color = CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END
WHEN NOT MATCHED THEN
  INSERT (fkey_id, Color) VALUES (SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END);
我得到一个错误:

错误10/22/2009 2:46:51 PM 0:00:00.000 SQL Server数据库错误:列名“FPARTNO”无效。56 0

我做错了什么

****我明白了!!!****

MERGE Sorels_ext AS SORe
USING (select SOR.identity_column, CASE
        WHEN left(SOR.FPARTNO, 2) = 'BL' THEN 'Blue'
        WHEN left(SOR.FPARTNO, 2) = 'RD' THEN 'Red'
        ELSE 'White'
      END as colors from Sorels as SOR) SOR1  
ON  (SORe.fkey_id = SOR1.identity_column)

WHEN MATCHED THEN
  UPDATE SET SORe.fkey_id = SOR1.identity_column, SORe.Color = SOR1.colors
WHEN NOT MATCHED THEN
  INSERT (fkey_id, Color) VALUES (SOR1.identity_column, SOR1.colors);

我认为您必须将源数据别名如下:

USING (select SOR.identity_column, 
   CASE  WHEN left(SOR.FPARTNO, 2) = 'BL' 
   THEN 'Blue'        
   WHEN left(SOR.FPARTNO, 2) = 'RD' 
   THEN 'Red'        
   ELSE 'White'      
   END from Sorels AS SOR) **AS SOR** ON  (SORe.fkey_id = SOR.identity_column)
试着去掉你的“)AS SOR”中的“AS”

应改为:

INSERT (fkey_id, Color) 

插入列表中的列只能引用目标表。解析器不希望在那里看到表别名,也不知道如何解析它


如果它看到“column1”,就知道它属于目标表。它看到“table1.column1”,它不知道“table1”是什么意思,因为“table1”作为标记超出了范围。

同意。OP示例使用的是该联接上不存在的表别名。我只是用该更正和新错误再次编辑了它。我真的很感谢你的耐心,我又更新了一次。我使用别名是为了让事情变得更简单、更清楚,它们似乎起到了相反的作用。我同意Peter的观点。插入列表中的列只能引用目标表,因此解析器不希望在那里看到表别名,也不知道如何解析它。它看到“column1”,就知道它属于目标表。它看到“table1.column1”,它不知道“table1”是什么意思。可以说,“table1”超出了范围。小的补充:分配
fkey\u id=identity\u列没有意义,因为您的查询已经验证了它们具有相同的值。
INSERT (fkey_id, Color)