帮助合并语句

use*_*140 2 sql-server t-sql sql-server-2008-r2 merge

我想比较表中的Distinct snfromHMI_Temp到-> 如果存在,我想更新值 - 得到这个语法检查!-如果确实存在,我想插入从数据到我都试过这个语法,但我得到的错误:snHMIsnsnHMI_TempHMI

无效的列名 'cb'
无效的列名 'lp'
无效的列名 cn
无效的列名 stn

这是我的语法 - 我应该如何重写它以实现我想要的结果?

MERGE INTO HMI AS Target
USING (SELECT DISTINCT sn FROM HMI_Temp) AS Source ON Target.sn = Source.sn
WHEN NOT MATCHED THEN
INSERT (lp, cb, cn, sn, stn) VALUES (Source.lp, Source.cb, Source.cn, Source.sn, Source.stn);
Run Code Online (Sandbox Code Playgroud)

DDL:

CREATE TABLE [dbo].[HMI_Temp]
(
    [sID] [int] IDENTITY(1,1) NOT NULL,
    stn [float] NULL,
    [sn] [nvarchar](255) NULL,
    [cn] [nvarchar](max) NULL,
    [lp] [nvarchar](max) NULL,
    [cb] [nvarchar](max) NULL,
    PRIMARY KEY CLUSTERED 
    (
        [sID] ASC
    ) WITH 
      (
           PAD_INDEX = OFF
         , STATISTICS_NORECOMPUTE = OFF
         , IGNORE_DUP_KEY = OFF
         , ALLOW_ROW_LOCKS = ON
         , ALLOW_PAGE_LOCKS = ON
      ) ON [PRIMARY]
) ON [PRIMARY] 
TEXTIMAGE_ON [PRIMARY]  
GO

SET IDENTITY_INSERT [dbo].[HMI_Temp] ON 
GO

INSERT [dbo].[HMI_Temp] ([sID], stn, [sn], [cn], [lp], [cb]) 
VALUES (1, 8888, N'Test', N'Test', N'Test123', N'Test456')
VALUES (1, 8888, N'SecondTest', N'SecondTest', N'SecondTest123', N'SecondTest456')
GO
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的更新语句,它起作用了,但现在如果不存在,则在其中插入扳手以进行插入:(

UPDATE y
SET y.lp = x.lp
,y.cb = x.cb
,y.cn = x.cn
FROM HMI y
INNER JOIN HMI_Temp x
ON y.stn = x.stn
AND y.sn = x.sn
AND y.cn = x.cn
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 5

这至少是问题的一部分:如果您有两行HMI_Temp具有相同的值sn但不同的值cb(或任何其他列),SQL Server 应该选择哪一个?

这是一个比MERGEIMHO更好的模式,它有各种问题

INSERT dbo.HMI(stn,sn,cn,lp,cb)
SELECT stn,sn,cn,lp,cb
FROM
(
  SELECT stn,sn,cn,lp,cb,rn = ROW_NUMBER() OVER 
    (
      PARTITION BY sn,cn -- makes sn + cn distinct
      ORDER BY sID       -- picks which row to keep
    )
  FROM dbo.HMI_Temp
  WHERE NOT EXISTS 
  (
    SELECT 1 FROM dbo.HMI WHERE sn = hmi.sn
  )
) AS x
WHERE rn = 1;
Run Code Online (Sandbox Code Playgroud)

这是采用最低的行,sID但您可能希望以不同的方式对行进行排名,或者在其他四列的每一列上使用MIN/MAX来确定要保留的行。从你的问题很难判断。