2015-09-14 12 views
0

Я пытаюсь сделать ссылку на ссылку на веб-странице с помощью элемента управления 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 

Функция работает Вид и работа отдельно, но вместе я до сих пор получить полный набор данных, возвращаемых.

ответ

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 функции, так что ошибки из-за того, что это не может быть связано. Я думал, что, возможно, мне нужно начать с возвращаемого набора данных из функции, а затем сделать joins, b – glstephens08

+0

Заказ не работает, если вы не используете TOP или что-то еще в представлении. – glstephens08

+0

Вы не должны использовать ORDER BY внутри представления. Согласно моему пониманию вещей, считается, что лучше делать заказы снаружи. т.е. SELECT * FROM SomeView ORDER BY SomeColulmn ASC – user5151179

0

Я заказана в Выбирается, так что я начинаю с Distinct 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