我有两张桌子。
Comments
- CommentId
- Comment
- CreateDate
- SomeCompositeKey
Exceptions
- ExceptionId
- Color
- CreateDate
- SomeCompositeKey
- ...and so on...
我的评论表格中添加了一个新的Color
列,其默认值为"白色"。
我需要回填并更新Comments
表上的新颜色字段。我需要根据评论的最近Comments.Color
和匹配的Exception.Color
(基于CreateDate
匹配)将Exception
列设置为等于SomeCompositeKey
。
这是使用SQL Server Management Studio。
答案 0 :(得分:1)
这应该可以解决问题......
IF OBJECT_ID('tempdb..#Comments', 'U') IS NULL
BEGIN -- DROP TABLE #Comments;
CREATE TABLE #Comments (
CommentId INT NOT NULL PRIMARY KEY CLUSTERED,
Comment VARCHAR(100) NOT NULL,
CreatedDate DATETIME NOT NULL,
Color VARCHAR(10) NOT NULL DEFAULT('White')
);
INSERT #Comments (CommentId, Comment, CreatedDate)
SELECT
t.n,
'Blah Blah Blah',
DATEADD(hh, t.n, GETDATE())
FROM
dbo.tfn_Tally(1500, 1) t;
END;
IF OBJECT_ID('tempdb..#Exceptions', 'U') IS NULL
BEGIN -- DROP TABLE #Exceptions;
CREATE TABLE #Exceptions (
ExceptionId INT NOT NULL PRIMARY KEY CLUSTERED,
Color VARCHAR(10) NOT NULL,
CreatedDate DATETIME NOT NULL
);
INSERT #Exceptions (ExceptionId, Color, CreatedDate)
SELECT
t.n,
CASE t.n % 9
WHEN 0 THEN 'Red'
WHEN 1 THEN 'Blue'
WHEN 2 THEN 'Green'
WHEN 3 THEN 'Yellow'
WHEN 4 THEN 'Purple'
WHEN 5 THEN 'Orance'
WHEN 6 THEN 'Gray'
WHEN 7 THEN 'White'
WHEN 8 THEN 'Black'
END,
DATEADD(hh, t.n * 13, GETDATE())
FROM
dbo.tfn_Tally(100, 1) t;
-- Add a unique nci on the CreatedDate column to improve performance.
CREATE UNIQUE NONCLUSTERED INDEX uix_Exceptions_CreatedDate ON #Exceptions
(CreatedDate) INCLUDE (Color);
END;
--=========================================================
-- option 1 (faster when there is an index on e.CreatedDate)
UPDATE c SET
c.Color = ex.Color
FROM
#Comments c
CROSS APPLY (
SELECT TOP 1
e.Color
FROM
#Exceptions e
WHERE
c.CreatedDate >= e.CreatedDate
ORDER BY
e.CreatedDate DESC
) ex;
--=========================================================
-- option 2 (faster when there is not index on e.CreatedDate)
WITH
cte_ExceptionRange AS (
SELECT
e.Color,
BegData = e.CreatedDate,
EndDate = LEAD(e.CreatedDate, 1, '9999-12-31') OVER (ORDER BY e.CreatedDate)
FROM
#Exceptions e
)
UPDATE c SET
c.Color = er.Color
FROM
#Comments c
JOIN cte_ExceptionRange er
ON c.CreatedDate >= er.BegData
AND c.CreatedDate <er.EndDate;
HTH,Jason
答案 1 :(得分:0)
检查此查询,它可以帮助您实现所需
;with data
as
(
Select ExceptionId,Color, SomeCompositeKey
,row_number() over (partition by SomeCompositeKey order by CreateDate desc) rowNumber
from Exceptions
)
update Comments set newColor=d.Color
from data d where d.rowNumber=1
and Comments.SomeCompositeKey=d.SomeCompositeKey