SQL中的相关子查询
我有两张桌子:A桌和B桌 表A和表B都有RowId列。 表A和表B都有ModifiedAt列。 表A还有一个名为Key的列。 检查条件: 如果表A“键”=someconstant,则从表A检索RowId 从表A中获取检索到的行Id,并检查这些行的ModifiedAt字段是否为>具有相同行Id的表B的ModifiedAt字段。 表B没有RowId的重复,但表A有 我自己尝试的: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
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逻辑本身出错。你说得很清楚。非常感谢