如何更新来自另一个表的TOP 1的列

Avi*_*ash 9 sql sql-server

我有2张桌子:

  • City表-列CityID,Name,Period
  • Assets表 - 列AssetID,Name

我必须更新Period的列City与表AssetID的的Assets与顶部1,其中表匹配City.Name=Assets.Name.该Assets表具有相同的不同资产名称.

示例Assets表:

AssetID  Name
1        Asset1
2        Asset1
3        Asset2
4        Asset2
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我尝试了不同的查询,但我无法得到它.

bni*_*dyc 12

UPDATE City
SET Period = a.AssetID
FROM (SELECT TOP 1 AssetID, Name FROM Assets ORDER BY AssetID ASC) AS a
WHERE City.Name = a.Name;
Run Code Online (Sandbox Code Playgroud)

  • 这只会更新匹配前1资产的城市.它不会更新所有匹配资产的城市.where子句对子查询没有影响 (4认同)

And*_*dyS 5

这应该有效:

update City
set Period = (
    select top 1 a.AssetID
    from Assets a
    where City.Name = a.Name
    order by a.AssetId asc)
Run Code Online (Sandbox Code Playgroud)

要测试的示例代码:

create table #City (CityId varchar(20), [Name] varchar(20), Period varchar(20))
create table #Assets (AssetId varchar(20), [Name] varchar(20))

insert into #City values (1, 'Asset1', null)
insert into #City values (2, 'Asset2', null)
insert into #City values (3, 'Asset3', null)

insert into #Assets values (1, 'Asset1')
insert into #Assets values (2, 'Asset1')
insert into #Assets values (3, 'Asset1')
insert into #Assets values (4, 'Asset2')
insert into #Assets values (5, 'Asset2')
insert into #Assets values (6, 'Asset3')
insert into #Assets values (7, 'Asset3')

select * from #City
select * from #Assets

update #City
set Period = (
    select top 1 a.AssetID
    from #Assets a
    where #City.Name = a.Name
    order by a.AssetId asc)

select * from #City

drop table #City
drop table #Assets
Run Code Online (Sandbox Code Playgroud)