2015-09-14 19 views
0

我想要做一個視圖來使用RadGrid控件在網頁上引用。我需要使用狀態表中的狀態以及項目的詳細信息,通過每個唯一項目的更改表中最後輸入的Changedate獲取項目表中所有記錄的子集以及項目的詳細信息。 ProjectId & StatusID作爲外鍵位於Changes表中。如何在視圖中使用函數僅返回不同的行聯合?

這是我的看法。

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 

功能的工作原理和工作觀分開,但結合我仍然得到完整的數據集返回。

回答

0

這一塊看起來很可疑:

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 
+0

我沒有將一個Project.ID傳遞給該函數,所以錯誤說不能綁定。我想,也許我需要從函數返回數據集開始,然後做我的加入,b – glstephens08

+0

除非您在視圖中使用TOP或其他內容,否則排序不起作用。 – glstephens08

+0

你不應該真的在視圖中使用ORDER BY。根據我對事物的理解,在外面進行排序被認爲是更好的做法。即,SELECT * FROM SomeView ORDER BY SomeColulmn ASC – user5151179

0

我重新排序的選擇,讓我先從鮮明project.ID然後再做連接。然後在Status.ID上取得最新的不同記錄集。

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 
+0

擁有該函數似乎有點矯枉過正,並且您使用它的方式與我對SQL函數旨在用於的功能的解釋並不完全一致。看看我以前的答案中的編輯,它可能更適合您的需求。 – user5151179

相關問題