我该如何重写SQL更新语句子查询以仅选择一行?
我尝试过TOP 1,但这只是将所有值更新为TOP 1选择值。
这就是我所拥有的:
BEGIN TRAN
UPDATE DBO.TRACKINGPROD
SET LEV8 = (SELECT SUBSTRING(LEV2, 1,
(SELECT CHARINDEX('-', LEV2) - 1))
FROM DBO.TRACKINGPROD)
ROLLBACK TRAN
结果:
信息512,第16级,状态1,第2行
子查询返回的值超过1。 当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。
该语句已终止。
表中的样本:
Lev2列= A1011-000-XXXXX AHN-XXXXX诉XXXXX牧场 Lev8 =空白
我的最终目标是用同一行中Lev2中短划线左侧的所有内容更新Lev8。
答案 0 :(得分:4)
我认为您可以通过单个查询来做到这一点:
UPDATE DBO.TRACKINGPROD
SET LEV8 = SUBSTRING(LEV2, 1, CHARINDEX('-', LEV2) - 1));
您也可以改用LEFT()
:
UPDATE DBO.TRACKINGPROD
SET LEV8 = LEFT(LEV2, CHARINDEX('-', LEV2) - 1);
答案 1 :(得分:1)
基于我在上面的评论中看到的内容,我可能误解了这个问题。尽管如此,万一有人碰到这篇文章,我将提供我谦虚的解决方案,其中仅更新表中的第一行,而第二项保持原样。
declare @t table (lev2 nvarchar(200), lev8 nvarchar(6))
insert into @t (lev2, lev8)
values
(
N'A1011-000-DAVID AHN - Zavala v. Okokase Rancho',
N''
),
(
N'A1011-000-DAVID AHN - Zavala v. Okokase Rancho',
N''
)
set rowcount 1;
update @t
set lev8 = substring(lev2, 1, charindex('-', lev2) - 1);
set rowcount 0;
SELECT *
FROM @t as t