SQL语句查询中的SQL Update NULL值

时间:2016-05-20 10:48:17

标签: sql-server

我很想在这个网站上发帖,但是已经使用它一段时间来获得SQL查询的帮助。 我有一个问题,我正试图解决。我在查询中有2列是机器和ID,对于某些机器,ID将为NULL,但对于其他机器,它们将具有ID值,如下所示。

Machine   ID
test1     3
test12    NULL
test3     4
test4     NULL

由于ID将出现在表中,我需要更新NULL值,如果机器名称与具有值的机器名称相同,例如test 1和test12都应该具有ID 3,但test12正在显示空值。我想要做的是用ID = 3替换test12的NULL,因为机器名称相似。

我已经尝试了COALESCE,ISNULL和CASE,它们都会更新值,但我需要知道值,但在完成select语句之前我不会知道它。 有关如何解决此问题的任何想法吗?

2 个答案:

答案 0 :(得分:0)

根据您上次评论中的要求:

  

表格中会有很多记录,它们按照' - '之前和之后的字母分组,即AB-CDE-L111,AB-CDE-L112,AB-CDE-L113,AB-CDE- L124,AB-CDE-L116所有这些都应该在查询中具有ID为45.下一组机器将是AB-CCC-L111,AB-CCC-L112,AB-CCC-L115所有这些应该具有查询ID为47,最后将有最后一台机器,AB-BBB-L113,AB-BBB-L144,AB-BBB-L115,AB-BBB-L120所有这些都应该在查询中有一个ID在查询中,一台机器返回一个NULL ID然后我需要更新查询结果,而不是表。

因此,SELECT查询可以获得结果:

declare @machine table  (Machine varchar(30) not null, ID int null)

insert into @machine
values ('AB-CDE-L111',     NULL),
('AB-CDE-L112',    NULL),
('AB-CDE-L113',     45),
('AB-CDE-L124',     NULL),
('AB-CDE-L116', NULL),
('AB-CCC-L111',     NULL),
('AB-CCC-L112',    NULL),
('AB-CCC-L113',     47),
('AB-CCC-L124',     NULL),
('AB-CCC-L116', NULL),
('AB-BBB-L111',     NULL),
('AB-BBB-L112',    NULL),
('AB-BBB-L113',     50),
('AB-BBB-L124',     NULL),
('AB-BBB-L116', NULL)

select m1.Machine, m2.ID
from @machine m1
inner join @machine m2
on m2.ID is not null
and left(m2.Machine, 6) = left(m1.Machine, 6)
order by m1.Machine

这假定:

1)构成机器代码前缀的字符总数相同。

2)每组中只有一台机器被分配了ID。

如果这些假设中的任何一个是错误的,那么你可能需要在1)的情况下进行额外的字符串操作,并在2)的情况下使用某种函数(ROW_NUMBER等)以避免重复的行(尽管如果SELECT DISTINCT s相同,你可以使用ID

答案 1 :(得分:0)

如评论中所述,您必须计算出匹配公式并在连接条件中指定它。我相信您正在寻找的查询是:

Create Table Machines (Name Varchar(8000), ID Int)
Insert Into Machines Values ('test1', 3)
Insert Into Machines Values ('test12', Null)
Insert Into Machines Values ('test3', 4)
Insert Into Machines Values ('test4', Null)
Insert Into Machines Values ('test89', Null)
Insert Into Machines Values ('test8', 5)
Insert Into Machines Values ('test64', Null)

Update M1 Set M1.ID = M2.ID
    From Machines M1
    Join (Select Left(Name,5) NamePrefix, Max(ID) ID 
            From Machines 
            Where ID Is Not Null 
            Group By Left(Name,5)) M2
     On Left(M1.Name, 5) = M2.NamePrefix
     Where M1.ID Is Null

Select * From Machines

请注意,我在联接查询中使用了group by,以防多行匹配,我们只想返回一个值。如果要特别选择选择哪个匹配,可以使用窗口函数或其他逻辑而不是组。