【问题标题】:MERGE INTO conversion from db2 to SQL Server从 db2 到 SQL Server 的 MERGE INTO 转换
【发布时间】:2017-09-26 16:51:08
【问题描述】:

我正在尝试使这个 db2 查询适应 SQL Server

 MERGE INTO wishlist AS wish USING 
    (SELECT * FROM TABLE (VALUES 
    (?,?,?,?,?,?,?,?,?,?,?,?))) 
    AS new(ID, USER_ID, CONTENT_ID,CONTENT_TYPE, 
    SKU, DATE, TIMESTAMP, VALUE, TITLE, URL, IMAGE_URL, ZONE) 
    ON 
   (wish.content_id = new.content_id and wish.value = new.value and 
   (wish.sku is null or wish.sku = new.sku)) 
WHEN MATCHED THEN UPDATE SET id  = new.id , date = new.date,  timestamp = 
   new.timestamp 
WHEN NOT MATCHED THEN INSERT 
     (ID, USER_ID, CONTENT_ID, CONTENT_TYPE, SKU, DATE, TIMESTAMP, VALUE, 
     TITLE, URL, IMAGE_URL, ZONE) 
     VALUES (new.ID, new.USER_ID, new.CONTENT_ID, 
     new.CONTENT_TYPE, new.SKU, new.DATE, new.TIMESTAMP, new.VALUE, 
     new.TITLE, w.URL, new.IMAGE_URL, new.ZONE)

我想出的是:

MERGE INTO wishlist AS wish 
USING
    (  SELECT  * FROM (VALUES 
    (?,?,?,?,?,?,?,?,?,?,?,?))
AS new(ID, USER_ID, CONTENT_ID, CONTENT_TYPE, SKU, DATE, TIMESTAMP, VALUE, 
TITLE, URL, IMAGE_URL, ZONE) 
ON
([wish].[content_id] = [new].[content_id] and [wish].[value] = [new].[value] 
and ([wish].[sku] is null or [wish].[sku] = [new].[sku]))
WHEN MATCHED THEN 
UPDATE SET id = new.id , date = new.date,  timestamp = new.timestamp 
WHEN NOT MATCHED THEN 
INSERT (ID, USER_ID, CONTENT_ID, CONTENT_TYPE, SKU, DATE, TIMESTAMP, VALUE, 
TITLE, URL, IMAGE_URL, ZONE) VALUES (new.ID, new.USER_ID, new.CONTENT_ID, 
new.CONTENT_TYPE, new.SKU, new.DATE, new.TIMESTAMP, new.VALUE, new.TITLE, 
new.URL, new.IMAGE_URL, new.ZONE)

在我看来,最后一个版本尊重文档https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql 中的语法,但我仍然得到:

Incorrect syntax near the keyword 'ON'.

【问题讨论】:

    标签: sql sql-server merge db2


    【解决方案1】:

    using() 的括号放错了位置,我还把你的别名从 wish 换成了 targetnew 换成了 src

    merge into wishlist as target
    using (
     select *
     from (
      values ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? )) 
       as new(ID, USER_ID, CONTENT_ID, CONTENT_TYPE, SKU, date, timestamp, VALUE, TITLE, URL, IMAGE_URL, ZONE)
      ) as src /* <--- added `) as src` to end using() */
       on [target].[content_id] = [src].[content_id] 
      and [target].[value] = [src].[value] 
      and ([target].[sku] is null or [target].[sku] = [src].[sku])
      WHEN matched THEN
        update
          set id = src.id
            , date = src.date
            , timestamp = src.timestamp 
      WHEN not matched THEN
      insert (ID, USER_ID, CONTENT_ID, CONTENT_TYPE, SKU, date, timestamp, VALUE, TITLE, URL, IMAGE_URL, ZONE ) 
      values (src.ID, src.USER_ID, src.CONTENT_ID, src.CONTENT_TYPE, src.SKU, src.date, src.timestamp, src.VALUE, src.TITLE, src.URL, src.IMAGE_URL, src.ZONE ) 
      --) /* <-- doesn't go here */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 2019-03-08
      • 1970-01-01
      • 2020-12-22
      • 2015-01-07
      相关资源
      最近更新 更多