将参数传递给子查询

vai*_*dil 3 sql sql-server reporting-services

我在 Visual Studio 2015 和 SQL Server 2014 中使用 SSRS/SSDT。有一个错误已经存在了超过 8 年,您无法从具有相同名称的不同表中选择多个列。为了解决这个问题,我需要使用子查询。我找到的每个答案都会重写给定的查询以删除子查询,这通常很好,但在这种情况下不适用。如何将参数传递给 SQL Server 中的子查询?

列别名不适用于此错误 -AS即使它适用于所有其他列,但使用也会在“重复”列上返回未知列错误。该SELECT子句中的最后两行之所以有效,是因为正在查询这些值,以便报表可以使用它们,但实际查询的其余部分不使用它们。

这是我当前的代码(不起作用,因为子查询返回多行)。

SELECT t.[Description],
       t.RequestedCompletionDate,
       t.CommitDate,
       t.StatusId,
       t.PriorityId,
       p.ProjectNumber,
       s.Name AS StatusDescription,
       pr.Name AS PriorityDescription
FROM ProjectTask t
inner join Project p
    on p.Id = t.ProjectId
inner join Project_TaskStatus s
    on s.Id = t.StatusId
inner join Project_Priority pr
    on pr.Id = t.PriorityId
WHERE t.Type = 'ET'
AND t.StatusId NOT IN (4,7)
AND
(
    SELECT StatusId FROM Project
    -- WHERE ?
)
NOT IN (3, 4)
ORDER BY t.PriorityId,
         t.CommitDate,
         t.RequestedCompletionDate
Run Code Online (Sandbox Code Playgroud)

这是注释中要求的带有别名的代码。它抛出一个错误:

SELECT t.[Description],
       t.RequestedCompletionDate,
       t.CommitDate,
       t.StatusId AS TaskStatusId,
       t.PriorityId,
       p.ProjectNumber,
       p.StatusId AS ProjectStatusId,
       s.Name AS StatusDescription,
       pr.Name AS PriorityDescription
FROM ProjectTask t
inner join Project p
    on p.Id = t.ProjectId
inner join Project_TaskStatus s
    on s.Id = TaskStatusId
inner join Project_Priority pr
    on pr.Id = t.PriorityId
WHERE t.Type = 'ET'
AND TaskStatusId NOT IN (4,7)
AND ProjectStatusId NOT IN (3,4)
ORDER BY t.PriorityId,
         t.CommitDate,
         t.RequestedCompletionDate

-- Invalid column name 'TaskStatusId'.
-- Invalid column name 'TaskStatusId'.
-- Invalid column name 'TaskStatusId'.
-- Invalid column name 'ProjectStatusId'.
-- Invalid column name 'ProjectStatusId'.
Run Code Online (Sandbox Code Playgroud)

理想的代码如下,但它会抛出 error An item with the same key has already been added,这是 SSRS/SSDT 在尝试返回多个同名列时抛出的错误。

SELECT t.[Description],
       t.RequestedCompletionDate,
       t.CommitDate,
       t.StatusId,
       t.PriorityId,
       p.ProjectNumber,
       p.StatusId,
       s.Name AS StatusDescription,
       pr.Name AS PriorityDescription
FROM ProjectTask t
inner join Project p
    on p.Id = t.ProjectId
inner join Project_TaskStatus s
    on s.Id = t.StatusId
inner join Project_Priority pr
    on pr.Id = t.PriorityId
WHERE t.Type = 'ET'
AND t.StatusId NOT IN (4,7)
AND p.StatusId NOT IN (3,4)
ORDER BY t.PriorityId,
         t.CommitDate,
         t.RequestedCompletionDate
Run Code Online (Sandbox Code Playgroud)

vai*_*dil 6

我对此感到非常愚蠢,但显然只需p.Id调用子查询就可以了。它知道我正在引用父查询的值,即使它位于子查询中。感谢大家的帮助。

SELECT t.[Description],
       t.RequestedCompletionDate,
       t.CommitDate,
       t.StatusId,
       t.PriorityId,
       p.ProjectNumber,
       s.Name AS StatusDescription,
       pr.Name AS PriorityDescription
FROM ProjectTask t
inner join Project p
    on p.Id = t.ProjectId
inner join Project_TaskStatus s
    on s.Id = t.StatusId
inner join Project_Priority pr
    on pr.Id = t.PriorityId
WHERE t.Type = 'ET'
AND t.StatusId NOT IN (4,7)
AND
(
    SELECT StatusId FROM Project WHERE Id = p.Id
)
NOT IN (3, 4)
ORDER BY t.PriorityId,
         t.CommitDate,
         t.RequestedCompletionDate
Run Code Online (Sandbox Code Playgroud)