SQL Server:如何根据where子句中的子查询更新表?

发布于 2024-10-28 19:11:04 字数 1694 浏览 3 评论 0原文

我有一个像这样的表(包含数据):

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[lTab](
    [log_id] [int] IDENTITY(1,1) NOT NULL,
    [JobName] [nvarchar](40) NULL,
    [startTime] [datetime] NULL,
    [endTime] [datetime] NULL,
    [BatchId] [int] NULL,
    [status] [varchar](10) NULL,
    [messag] [varchar](255) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
SET IDENTITY_INSERT [dbo].[lTab] ON
INSERT [dbo].[lTab] ([log_id], [JobName], [startTime], [endTime], [BatchId], [status], [messag]) VALUES (1, N'Job1', CAST(0x00009EB700FBF56F AS DateTime), NULL, 2, N'START', N'Test')
INSERT [dbo].[lTab] ([log_id], [JobName], [startTime], [endTime], [BatchId], [status], [messag]) VALUES (2, N'Job2', NULL, CAST(0x00009EB700FBF975 AS DateTime), 2, N'START', N'Test')
INSERT [dbo].[lTab] ([log_id], [JobName], [startTime], [endTime], [BatchId], [status], [messag]) VALUES (3, N'Job3', CAST(0x00009EB700FC287F AS DateTime), NULL, 2, N'START', N'Test')
INSERT [dbo].[lTab] ([log_id], [JobName], [startTime], [endTime], [BatchId], [status], [messag]) VALUES (4, N'Job3', NULL, CAST(0x00009EB700FC2CC6 AS DateTime), 2, N'END', N'Test')
SET IDENTITY_INSERT [dbo].[lTab] OFF

我正在尝试根据 Jobname 和 max(log_id) 更新 endTime。

DECLARE @Jname VARCHAR(10)
SET @Jname = 'Job3'

UPDATE lTab
SET endTime = GETDATE() 
WHERE log_id = (SELECT JobName, MAX(log_id) AS log_id FROM dbo.lTab WHERE jobname = @Jname GROUP BY JobName)

我收到错误

sg 116, Level 16, State 1, Line 6
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

如何完成这项工作?

I have a table (with data) like this:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[lTab](
    [log_id] [int] IDENTITY(1,1) NOT NULL,
    [JobName] [nvarchar](40) NULL,
    [startTime] [datetime] NULL,
    [endTime] [datetime] NULL,
    [BatchId] [int] NULL,
    [status] [varchar](10) NULL,
    [messag] [varchar](255) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
SET IDENTITY_INSERT [dbo].[lTab] ON
INSERT [dbo].[lTab] ([log_id], [JobName], [startTime], [endTime], [BatchId], [status], [messag]) VALUES (1, N'Job1', CAST(0x00009EB700FBF56F AS DateTime), NULL, 2, N'START', N'Test')
INSERT [dbo].[lTab] ([log_id], [JobName], [startTime], [endTime], [BatchId], [status], [messag]) VALUES (2, N'Job2', NULL, CAST(0x00009EB700FBF975 AS DateTime), 2, N'START', N'Test')
INSERT [dbo].[lTab] ([log_id], [JobName], [startTime], [endTime], [BatchId], [status], [messag]) VALUES (3, N'Job3', CAST(0x00009EB700FC287F AS DateTime), NULL, 2, N'START', N'Test')
INSERT [dbo].[lTab] ([log_id], [JobName], [startTime], [endTime], [BatchId], [status], [messag]) VALUES (4, N'Job3', NULL, CAST(0x00009EB700FC2CC6 AS DateTime), 2, N'END', N'Test')
SET IDENTITY_INSERT [dbo].[lTab] OFF

I'm trying to update endTime based on Jobname and max(log_id).

DECLARE @Jname VARCHAR(10)
SET @Jname = 'Job3'

UPDATE lTab
SET endTime = GETDATE() 
WHERE log_id = (SELECT JobName, MAX(log_id) AS log_id FROM dbo.lTab WHERE jobname = @Jname GROUP BY JobName)

I get an error

sg 116, Level 16, State 1, Line 6
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

How to get this work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

瞳孔里扚悲伤 2024-11-04 19:11:04
WITH    q AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY JobName ORDER BY log_id DESC) AS rn
        FROM    lTab
        WHERE   JobName = @Jname
        )
UPDATE  q
SET     endTime = GETDATE() 
WHERE   rn = 1
WITH    q AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY JobName ORDER BY log_id DESC) AS rn
        FROM    lTab
        WHERE   JobName = @Jname
        )
UPDATE  q
SET     endTime = GETDATE() 
WHERE   rn = 1
冰雪之触 2024-11-04 19:11:04

从子查询的选择列表中取出Jobname

你实际上并不需要它来获得你需要的结果,SQL Server仍然会返回正确的log_id。

由于您返回 2 个字段(JobnameMAX(Log_id))并尝试将 Log_id 与其匹配,因此您所拥有的内容将不起作用。

Take out the Jobname from the select list in the subquery.

You don't actually need it to get the result you need, SQL Server will still return the right log_id.

What you have won't work since you are returning 2 fields (Jobname,MAX(Log_id)) and trying to match Log_id to it.

南渊 2024-11-04 19:11:04

此查询:

(SELECT JobName, MAX(log_id) AS log_id FROM dbo.lTab WHERE jobname = @Jname GROUP BY JobName)

返回多个结果,从查询中排除 JobName。

This query:

(SELECT JobName, MAX(log_id) AS log_id FROM dbo.lTab WHERE jobname = @Jname GROUP BY JobName)

is returning multiple results, exclude JobName from your query.

束缚m 2024-11-04 19:11:04

然而更好的选择是

UPDATE tablename SET tablename.field1 = sourceTable.dataField
From tablename 
join sourceTable On tablename.keyfield = sourceTable.keyField
Where sourceTable.jobname = @jobName

Yet a better option would be

UPDATE tablename SET tablename.field1 = sourceTable.dataField
From tablename 
join sourceTable On tablename.keyfield = sourceTable.keyField
Where sourceTable.jobname = @jobName
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文