1

我有一个名为 tblData 的表,其中包含以下数据。

查询前:

   ID DisplayNum   Called
    1     A1        NULL
    2     A1        NULL
    3     A1        NULL
    4     B4        NULL
    5     B4        NULL

我现在有了:

UPDATE TOP (1) tblData SET Called = GETDATE() WHERE DisplayNum = @DisplayNo AND Called IS NULL

ID DisplayNum   Called
1     A1        7/1/2013 9:00 AM
2     A1        7/1/2013 9:00 AM
3     A1        7/1/2013 9:00 AM
4     B4        7/1/2013 9:30 AM
5     B4        7/1/2013 9:30 AM

我只想更新那个特定 DisplayNum 调用为空的顶级记录

ID DisplayNum   Called
1     A1        7/1/2013 9:00 AM
2     A1        7/1/2013 9:05 AM
3     A1        7/1/2013 9:08 AM
4     B4        7/1/2013 9:20 AM
5     B4        7/1/2013 9:26 AM

当该特定组的不同 ID 时,我如何获得它?

4

4 回答 4

1
UPDATE T
SET Called = GETDATE()
FROM tblData T
    INNER JOIN
        (SELECT ID, ROW_NUMBER(PARTITION BY DisplayNum ORDER BY ID) correlative
         FROM tblData
         WHERE Called IS NULL AND DisplayNum = @DisplayNo) TD ON T.ID=TD.ID
WHERE TD.correlative=1
于 2013-07-01T14:28:36.003 回答
1

你想用仍然满足你的 WHERE 条件的最低 ID 更新记录,我做对了吗?

尝试

UPDATE tblData 
  SET Called = GETDATE() 
  WHERE DisplayNum = @DisplayNo AND Called IS NULL
    AND ID = (SELECT TOP 1 ID FROM tblData WHERE DisplayNum = 'A1' AND Called IS NULL ORDER BY ID ASC)
于 2013-07-01T13:58:14.607 回答
1
update  a 
set a.Called = GETDATE() 
from tblData a join (select min(ID) ID, DisplayNum 
                     from test
                     group by DisplayNum) b 
on (a.ID = b.ID and a.DisplayNum = b.DisplayNum)
where a.Called is NULL;
于 2013-07-01T14:03:50.580 回答
0

根据问题中的当前信息,应该没有问题(除非您UPDATE多次调用)。这是关于 SQL Fiddle的演示。

这是一种无需使用即可执行更新的方法TOP

DECLARE @@DisplayNo varchar(2)
SELECT @@DisplayNo = 'A1'

;WITH tblRN AS
(
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY DisplayNum 
                      ORDER BY ID) AS RowNum
  FROM tblData
)

UPDATE tblRN
  SET CALLED = GETDATE()
WHERE
  DisplayNum = @@DisplayNo AND
  CALLED IS NULL AND
  RowNum = 1
于 2013-07-01T14:33:10.790 回答