use*_*140 2 sql-server t-sql sql-server-2008-r2 merge
我想比较表中的Distinct sn
fromHMI_Temp
到-> 如果存在,我想更新值 - 得到这个语法检查!-如果确实不存在,我想插入从数据到我都试过这个语法,但我得到的错误:sn
HMI
sn
sn
HMI_Temp
HMI
无效的列名 '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)
这至少是问题的一部分:如果您有两行HMI_Temp
具有相同的值sn
但不同的值cb
(或任何其他列),SQL Server 应该选择哪一个?
这是一个比MERGE
IMHO更好的模式,它有各种问题:
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
来确定要保留的行。从你的问题很难判断。
归档时间: |
|
查看次数: |
1121 次 |
最近记录: |