我正在使用SQL函数返回两个表中的条目。表A包含有关UserId
,FileID
和Created
日期时间的信息。
表B包含有关UserID
,FileID
和传输State
的信息。
该函数应返回UserID
,FileID
,Created
和State
该功能如下所示:
WITH FindNewestVersion as
(
Select Created AS cDate, FileId AS fId, UserId AS uId, ROW_NUMBER() over (partition by FileId, UserId ORDER BY Created DESC)rn from TableA
where Created <= @dueDate
)
SELECT * from TableB AS B, TableA AS A
INNER JOIN (Select cDate, userId, FileId from FindNewestVersion where rn = 1) AS x
ON A.Created = cDate AND A.UserId = uId AND A.FileId = fId
WHERE A.UserId = ISNULL(@userId, A.UserId) AND A.FileId = ISNULL(@fileId, q.FileId)
AND B.TaskType = 'Transmission'
我在C#中使用的函数的调用如下所示:
select A.UserId, A.FileId, A.Created, A.VersionId,
case when B.variableColumn1 is null then null else B.variable1 end AS TransState
from dbo.LSFN_GetMatrixAtDueDate([PARAMETERS]) AS A left join TableB AS B
ON A.VersionId = B.variableColumn2 AND A.VersionId = B.variableColumn3
我正在使用此调用,因为表B中的列可以包含各种任务的不同信息,我必须借助于&#34;传输任务&#34;的配置文件来确定正确的列。但是我不想使用动态SQL,所以我可以使用columnNames作为函数本身的参数。
所以,这个函数和调用几乎正常工作。让我们举个例子。
表A包含:
UserID | FileID | Created
--------------------------------
UserA | FileA | 01.01.2011
UserA | FileB | 01.01.2011
UserC | FileC | 01.01.2011
表B包含:
Variable1 (State) | Variable2 (Version/File) | Variable3 (UserId)
------------------------------------------------------------------
Completed | FileA | UserA
Completed | FileC | UserC
所以,让我们说,我想得到属于UserA的两个表的所有条目 结果应如下所示:
UserID | FileID | Created | State
----------------------------------------
UserA | FileA | 01.01.2011 | Completed
UserA | FileB | 01.01.2011 | NULL
但是,我为每个结果获取多个条目,因此结果如下所示:
UserID | FileID | Created | State
----------------------------------------
UserA | FileA | 01.01.2011 | Completed
UserA | FileA | 01.01.2011 | Completed
UserA | FileB | 01.01.2011 | NULL
UserA | FileB | 01.01.2011 | NULL
它以某种方式与表B中的条目数量相关。如果我删除了UserC的条目,我将获得所有结果条目的正确,但如果我向TableB添加另一行(这样有3个条目),我将得到每个结果三次。 我想这与select有关,我在调用函数,但我不知道那里有什么问题......