Function 如何在视图中使用函数只返回行的不同并集?
我正在尝试使用RadGrid控件在网页上查看参考。我需要在每个唯一项目的变更表中最后输入的变更日期之前,获取项目表中所有记录的子集,状态表中的状态以及项目的详细信息。ProjectId和StatusID作为外键在更改表中 这是我的看法Function 如何在视图中使用函数只返回行的不同并集?,function,sql-server-2012,dataset,views,radgrid,Function,Sql Server 2012,Dataset,Views,Radgrid,我正在尝试使用RadGrid控件在网页上查看参考。我需要在每个唯一项目的变更表中最后输入的变更日期之前,获取项目表中所有记录的子集,状态表中的状态以及项目的详细信息。ProjectId和StatusID作为外键在更改表中 这是我的看法 CREATE VIEW [dbo].[Project-by_View] AS SELECT TOP (100) PERCENT dbo.Projects.Id, dbo.Projects.ProjectName, dbo.Departmen
CREATE VIEW [dbo].[Project-by_View]
AS
SELECT TOP (100) PERCENT
dbo.Projects.Id,
dbo.Projects.ProjectName,
dbo.Department.Name,
dbo.Designer.FName + ' ' + dbo.Designer.LName AS Designer,
dbo.Changes.ChangeDate,
dbo.Projects.DueDate,
dbo.Projects.Instructions,
dbo.Status.Description
FROM dbo.Projects
INNER JOIN dbo.Department
ON dbo.Department.ID = dbo.Projects.DeptID
INNER JOIN dbo.Designer
ON dbo.Designer.Id = dbo.Projects.DesignerID
INNER JOIN dbo.Changes
ON dbo.Changes.ProjectID = dbo.Projects.ID
INNER JOIN dbo.Status
ON dbo.Changes.StatusID = dbo.Status.Id
WHERE EXIST (SELECT *
FROM GetAllLastChangeDatebyProjectIds(0))
ORDER BY dbo.Projects.ID DESC
GO
以及我的职能
USE [FIDO_DEV]
GO
/****** Object: UserDefinedFunction [dbo].[GetAllLastChangeDatebyProjectIds]
Script Date: 9/14/2015 4:31:22 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author, Geoffrey Stephens>
-- Create date: <Create Date, 09/14/20115>
-- Description: <Description, table of the Last Change Date for each Project>
-- =============================================
ALTER FUNCTION [dbo].[GetAllLastChangeDatebyProjectIds]
(
@ProjectID int
)
RETURNS TABLE
AS
RETURN
(
Select ProjectID, StatusID, ChangeDate from (
Select
ProjectID, StatusID, ChangeDate,
row_number() over(partition by ProjectID order by ChangeDate desc) as rn
from
Changes
) t
where t.rn = 1)
GO
函数和视图分别工作,但结合使用,我仍然返回完整的数据集。此块看起来可疑:
WHERE EXIST (SELECT *
FROM GetAllLastChangeDatebyProjectIds(0))
它不应该看起来更像:
WHERE EXIST (SELECT *
FROM GetAllLastChangeDatebyProjectIds(Projects.Id))
我没有看得更深,那只是突然向我扑来
尝试将这种格式重新格式化为我喜欢的样式
SELECT Projects.Id,
dbo.Projects.ProjectName,
dbo.Department.Name,
dbo.Designer.FName + ' ' + dbo.Designer.LName AS Designer,
dbo.Changes.ChangeDate,
dbo.Projects.DueDate,
dbo.Projects.Instructions,
dbo.Status.Description
FROM ( SELECT ProjectID,
StatusID,
ChangeDate
FROM ( FROM ProjectID,
StatusID,
ChangeDate,
row_number() OVER (PARTITION BY ProjectID ORDER BY ChangeDate DESC) as rn
FROM Changes) t
WHERE t.rn = 1)) AS Selection
INNER JOIN dbo.Projects
ON dbo.Projects.ID = Selection.ProjectID
INNER JOIN dbo.Designer
ON dbo.Designer.Id = dbo.Projects.DesignerID
INNER JOIN dbo.Department
ON dbo.Department.ID = dbo.Projects.DeptID
INNER JOIN dbo.Changes
ON dbo.Changes.ProjectID = dbo.Projects.ID
INNER JOIN dbo.Status
ON dbo.Changes.StatusID = dbo.Status.Id
WHERE Selection.StatusID = dbo.Changes.StatusID
ORDER BY dbo.Projects.ID DESC
我重新排列了选择项的顺序,以便从Distinct project.ID开始,然后进行连接。然后在Status.ID上执行where以获取最新的不同记录集
Select TOP 100 PERCENT Projects.Id, dbo.Projects.ProjectName, dbo.Department.Name, dbo.Designer.FName + ' ' + dbo.Designer.LName AS Designer, dbo.Changes.ChangeDate, dbo.Projects.DueDate, dbo.Projects.Instructions, dbo.Status.Description
From GetAllLastChangeDatebyProjectIds(0) INNER JOIN
dbo.Projects ON dbo.Projects.ID = dbo.GetAllLastChangeDatebyProjectIds.ProjectID INNER JOIN
dbo.Designer ON dbo.Designer.Id = dbo.Projects.DesignerID INNER JOIN
dbo.Department ON dbo.Department.ID = dbo.Projects.DeptID INNER JOIN
dbo.Changes ON dbo.Changes.ProjectID = dbo.Projects.ID INNER JOIN
dbo.Status ON dbo.Changes.StatusID = dbo.Status.Id
Where dbo.GetAllLastChangeDatebyProjectIds.StatusID = dbo.Changes.StatusID
ORDER BY dbo.Projects.ID DESC
我没有将Project.ID传递给函数,因此出错时会说它无法绑定。我在想,也许我需要从函数的返回数据集开始,然后执行连接,除非在视图中使用TOP或其他内容,否则bOrder by不起作用。你不应该在视图中真正使用ORDER by。根据我对事物的理解,在外面订货被认为是更好的做法。也就是说,从SomeView中选择*SomeColulmn ASCIt拥有该函数似乎有点过分,而且您使用它的目的与我对SQL函数的用途的解释并不完全一致。查看我在上一个答案中的编辑,它可能更适合您的需要。