0

我有 2 张桌子。一个称为“Tasks”,另一个在我的“Task”中称为“TaskDescription”,设置如下所示:“taskID(primary)”、“FileID”、“TaskTypeID”和一堆其他不相关的列。

然后在我的“TaskDescription”中,设置看起来像:“TaskTypeID”、“TaskTypeDesc”

因此,例如,如果 TaskTypeID 为 1 ,则描述将为“admin”,或者如果 TaskTypeID 为 2,则 TaskTypeDesc 将为“Employee”等。

这两个表在主/外键“TaskTypeID”上有关系。

我想要做的是获取一个任务 ID,以及 FileID 与 @fileID 匹配的 TaskDesc(我作为参数传入)。但是,在我的查询中,我在尝试获取描述时返回了多行而不是单行。

这是我的查询:

SELECT taskid,
       ( 'Task ID: '
         + Cast(cf.taskid AS NVARCHAR(15)) + ' - '
         + Cast((SELECT DISTINCT td.tasktypedesc FROM casefiletaskdescriptions
         td JOIN
         casefiletasks cft ON td.tasktypeid=cft.tasktypeid WHERE cft.taskid =
         1841 )AS
         NVARCHAR(100))
         + ' - Investigator : ' + ( Cast(i.fname AS NVARCHAR(20)) + ' '
                                    + Cast(i.lname AS NVARCHAR(20)) ) ) AS
       'Display'
FROM   casefiletasks [cf]
       JOIN investigators i
         ON CF.taskasgnto = i.investigatorid
WHERE  cf.fileid = 2011630988
       AND cf.concluded = 0
       AND cf.progressflag != 'Conclude' 

我试图让输出看起来像“任务 ID:1234 - 管理员 - 调查员:John Doe”。但是我在这方面遇到了麻烦:

CAST((select DISTINCT td.TaskTypeDesc from CaseFileTaskDescriptions td 
JOIN CaseFileTasks cft ON td.TaskTypeID=cft.TaskTypeID 
where cft.TaskID =1841 )as nvarchar(100))

这似乎可行,但问题是我必须对值“1841”进行硬编码才能使其工作。有没有办法用从 TaskID 选择查询返回的值分配一个“taskID”变量,或者它不会工作,因为我认为 sql 一次运行所有内容而不是逐行运行。

编辑-这是在 Microsoft SQL Server Management Studio 2008 中

4

3 回答 3

2

您可以动态引用集合中存在的列FROM。在这种情况下,它将是来自casefiletasks或的任何列investigators。您将替换1841table.column参考。

更新

用列引用替换您的静态整数,您的查询将如下所示:

SELECT taskid,
       ( 'Task ID: '
         + Cast(cf.taskid AS NVARCHAR(15)) + ' - '
         + Cast((SELECT DISTINCT td.tasktypedesc FROM casefiletaskdescriptions
         td JOIN
         casefiletasks cft ON td.tasktypeid=cft.tasktypeid WHERE cft.taskid =
         cf.taskid )AS
         NVARCHAR(100))
         + ' - Investigator : ' + ( Cast(i.fname AS NVARCHAR(20)) + ' '
                                    + Cast(i.lname AS NVARCHAR(20)) ) ) AS
       'Display'
FROM   casefiletasks [cf]
       JOIN investigators i
         ON CF.taskasgnto = i.investigatorid
WHERE  cf.fileid = 2011630988
       AND cf.concluded = 0
       AND cf.progressflag != 'Conclude' 
于 2012-10-24T15:09:12.840 回答
1

为什么不只做另一个联接而不是子查询呢?

SELECT taskid,
       ( 'Task ID: '
         + Cast(cf.taskid AS NVARCHAR(15)) + ' - '
         + Cast(td.tasktypedesc AS NVARCHAR(100))
         + ' - Investigator : ' + ( Cast(i.fname AS NVARCHAR(20)) + ' '
                                    + Cast(i.lname AS NVARCHAR(20)) ) ) AS
       'Display'
FROM   casefiletasks [cf]
       JOIN investigators i
         ON CF.taskasgnto = i.investigatorid
       JOIN casefiletaskdescriptions td
         ON td.tasktypeid = cf.tasktypeid
WHERE  cf.fileid = 2011630988
       AND cf.concluded = 0
       AND cf.progressflag != 'Conclude' 
于 2012-10-24T15:21:44.447 回答
1

这可以作为您的内部查询吗?

SELECT DISTINCT td.TaskTypeDesc FROM CaseFileTaskDescriptions td 
JOIN CaseFileTasks cft ON td.TaskTypeID = cft.TaskTypeID 
WHERE cft.TaskID = cf.TaskID
于 2012-10-24T15:04:03.053 回答