如果在联接表中没有记录并且您只引用联接表字段,则 LAG 函数的默认参数为什么只适用于返回结果的第一列?
为了更好地解释这一点,我创建了以下情境。
架构
CREATE TABLE Blogs(
Id int IDENTITY(1,1) CONSTRAINT PK_Blogs_Id PRIMARY KEY,
Title NVARCHAR(1000)
)
CREATE TABLE Comments(
Id int IDENTITY(1,1) CONSTRAINT PK_Comments_Id PRIMARY KEY,
BlogId INT NOT NULL,
CommentText NVARCHAR(max)
)
INSERT INTO Blogs (Title) VALUES ('Blog 1')
INSERT INTO Blogs (Title) VALUES ('Blog 2')
INSERT INTO Blogs (Title) VALUES ('Blog 3')
INSERT INTO Blogs (Title) VALUES ('Blog 4')
INSERT INTO Blogs (Title) VALUES ('Blog 5')
INSERT INTO Comments (BlogId, CommentText) VALUES (4,'Some text')
INSERT INTO Comments (BlogId, CommentText) VALUES (4,'Some text 2')
查询
SELECT *,
LAG(CommentText,1,'No comment') OVER (Partition by Comments.BlogId ORDER BY Comments.Id Desc) LastComment
FROM Blogs LEFT JOIN Comments on Blogs.Id = Comments.BlogId;
在上面的查询中,它将返回第一行“LastComment”为“无评论”的结果,并且在行具有其他评论的情况下,其余部分将为空。
我知道如果您在窗口函数中引用Blogs的键(以下查询),它会正确运行(所有为空的行将在LastComment字段中返回“无评论”),但我正试图理解为什么如果连接返回空值,则LAG函数中的默认参数不会应用于LastComment。
SELECT *,
LAG(CommentText,1,'No comment') OVER (Partition by Blogs.Id ORDER BY Comments.Id Desc) LastComment
FROM Blogs LEFT JOIN Comments on Blogs.Id = Comments.BlogId;
这是一个关于IT技术的SQL fiddle示例,链接为http://sqlfiddle.com/#!18/eb850/9。
编辑说明:需要澄清的是,在这个SQL fiddle示例中,为什么Blog 1返回默认值“无评论”,而其他也没有评论的博客返回NULL。为什么第一行会被分配默认值,而其他行不会?既然LAG没有记录可读,Blog 1也应该返回NULL,为什么没有呢?
Comments.BlogId
为空,而Blogs.Id
不为空。 - Zohar PeledLag(isnull(CommentText,'No comment'),1,'No comment' )
。 - Clay