Function 如何在视图中使用函数只返回行的不同并集?

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

我正在尝试使用RadGrid控件在网页上查看参考。我需要在每个唯一项目的变更表中最后输入的变更日期之前,获取项目表中所有记录的子集,状态表中的状态以及项目的详细信息。ProjectId和StatusID作为外键在更改表中

这是我的看法

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函数的用途的解释并不完全一致。查看我在上一个答案中的编辑,它可能更适合您的需要。