【问题标题】:Need help with the Merge statement在 Merge 语句方面需要帮助
【发布时间】:2009-10-22 18:43:31
【问题描述】:

我想从名为 Sorels 的表中更新名为 Sorels_ext 的表。它们之间的联系是 Sorels_ext 的 fkey_id 等于 Sorels 表的 identity_column。这是我第一次尝试 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 数据库错误:在 MERGE 语句中使用的插入列列表不能包含多部分标识符。请改用单部分标识符。 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);

【问题讨论】:

  • 小补充:分配fkey_id = identity_column 没有意义,因为您的查询已经验证它们具有相同的值。

标签: sql sql-server tsql sql-server-2008


【解决方案1】:
INSERT (SORe.fkey_id, SORe.Color) 

应改为:

INSERT (fkey_id, Color) 

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

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

【讨论】:

  • 我同意彼得的观点。
  • 插入列表中的列只能引用目标表,因此解析器不希望在那里看到表别名,也不知道如何解析它。它看到“column1”,它知道它属于目标表。它看到“table1.column1”,它不知道“table1”是什么意思。可以这么说,“table1”超出了范围。
【解决方案2】:

我相信您必须像这样为您的源数据起别名:

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)

【讨论】:

  • 同意。 OP 示例正在使用该 JOIN 上不存在的表别名。
  • 我刚刚用那个更正和新的错误再次编辑了它。非常感谢您的耐心等待。
  • 我又更新了。我使用别名使事情变得更简单、更清晰,但它们似乎产生了相反的效果。
【解决方案3】:

尝试去掉“) AS SOR”中的“AS”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多