SQL中的相关子查询

SQL中的相关子查询,sql,sql-server,Sql,Sql Server,我有两张桌子:A桌和B桌 表A和表B都有RowId列。 表A和表B都有ModifiedAt列。 表A还有一个名为Key的列。 检查条件: 如果表A“键”=someconstant,则从表A检索RowId 从表A中获取检索到的行Id,并检查这些行的ModifiedAt字段是否为>具有相同行Id的表B的ModifiedAt字段。 表B没有RowId的重复,但表A有 我自己尝试的: select * from dbo.ResultsStored rs WHERE HashedKey = hashbyt

我有两张桌子:A桌和B桌

表A和表B都有RowId列。 表A和表B都有ModifiedAt列。 表A还有一个名为Key的列。 检查条件:

如果表A“键”=someconstant,则从表A检索RowId 从表A中获取检索到的行Id,并检查这些行的ModifiedAt字段是否为>具有相同行Id的表B的ModifiedAt字段。 表B没有RowId的重复,但表A有

我自己尝试的:

select *
from dbo.ResultsStored rs
WHERE HashedKey = hashbytes('MD5', @StringConcat) 
                       and 
                       rs.ModifiedAT > (select Max(ModifiedAt)
    from dbo.Patients P
    where P.RowId = rs.RowId)
注: 另外,让我惊讶的是,如果我用硬编码的值(比如“1”)替换rs.RowId,它会工作,但不是这样

当我硬编码rs.RowId时的结果:

if not exists (select * from dbo.ResultsStored RS where RS.HashedKey =  0xBBE4D4DC92C713756E6683ADD671F7DA and ModifiedAt > (select ModifiedAt from dbo.Patients where RowId = 1))
begin
print'not exists'
end
else
begin
print 'exists'
end
输出:不存在

if not exists (select * from dbo.ResultsStored RS where RS.HashedKey =  0xBBE4D4DC92C713756E6683ADD671F7DA and ModifiedAt > (select ModifiedAt from dbo.Patients where RowId = rs.RowId))
begin
print'not exists'
end
else
begin
print 'exists'
end
输出:存在

预期输出:不存在

我能在这方面得到一些帮助吗?

声明@RowId INT

为从患者中选择RowId声明CurRowId光标

开放CurRowId

从CurRowId获取下一个到@RowId

而@@FETCH\u STATUS=0

开始

如果不存在,请从dbo.ResultsStored中选择*,其中ModifiedAt>

                 (select ModifiedAt from dbo.Patients where RowId = 
                                                                   @RowId))
开始

打印“不存在”

end

else

begin

print 'exists'

END

FETCH  NEXT FROM CurRowId INTO @RowId

END

问题在于你的数据。 如果我理解正确,您想知道结果中是否有日期大于患者日期的行。如果没有找到这样的行,那么就可以了

如果是这样,您的查询看起来是正确的。您可以通过以下方式直接选择不正确的数据:

SELECT  *
FROM    Patients p
        CROSS APPLY ( SELECT    MAX(ModifiedAt) AS ModifiedAt
                      FROM      ResultsStored rs
                      WHERE     p.RowId = rs.RowId
                    ) a
WHERE   a.ModifiedAt > p.ModifiedAt

对于任何A.RowId,B是否有超过1行?使用>进行比较时,子查询中只能有一行。否。B具有唯一的RowId。我认为它不起作用,因为如果我使用一个特定的id来代替.RowId,比如“1”,它会给我预期的结果,但不是这样,上面查询的输出是什么?有什么问题?@SelvaTS:Updated。请检查我相信我们可以用相关子查询完成这项工作,这里不需要游标。您希望患者退出而不是退出,那么相关子查询不起作用。它只提供一个输出。我的if逻辑本身出错。你说得很清楚。非常感谢