2009-10-22 132 views
5

我想从名为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秒0:00:00.000的SQL Server数据库错误:关键字'附近的语法不正确上'。 46 0

*** ADDED INFO ******

第一修正建议后,代码如下:

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); 
+0

恭喜。 – 2009-10-22 21:07:09

+0

小增加:分配'fkey_id = identity_column'毫无意义,因为您的查询已经验证它们具有相同的值。 – 2011-03-25 22:33:23

回答

4

我相信你有你的别名源数据像这样:

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) 
+1

同意。 OP示例使用该JOIN中不存在的表别名。 – 2009-10-22 18:57:41

+0

我刚刚使用该更正和新错误编辑了它。我非常感谢你的耐心。 – DavidStein 2009-10-22 19:00:10

+0

我再次更新它。我正在使用别名来使事情变得更简单和更清晰,并且它们似乎具有相反的效果。 – DavidStein 2009-10-22 19:48:56

0

尝试采取了 “AS” 你 “)作为SOR”

5
INSERT (SORe.fkey_id, SORe.Color) 

应改为:

INSERT (fkey_id, Color) 

列中插入列表中的CA n只能引用目标表。解析器不期望在那里看到一个表别名,并且不知道如何解决它。

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

+0

我同意彼得在这一个。 – rfonn 2009-10-22 19:35:40

+0

工作,但你能解释为什么? – DavidStein 2009-10-22 19:37:21

+1

插入列表中的列只能引用目标表,因此解析器不期望在那里看到表别名,不知道如何解决它。它看到“column1”,它知道它属于目标表。它看到“table1.column1”,它不知道“table1”是什么意思。 “table1”超出了范围,可以这么说。 – 2009-10-22 19:48:32