SQL中的相关子查询

时间:2015-03-09 09:01:08

标签: sql sql-server

我有两个表:表A和表B

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

    1. 如果表A'Key'= someconstant
    2. ,则从表A中检索RowId
    3. Table A获取检索到的行ID,并检查这些行的ModifiedAt字段是否为>表B的ModifiedAT字段具有相同的rowId。
    4. 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)
      

      注意: 另外,让我感到惊讶的是,如果我用硬编码的值替换rs.RowId说'1',它可以工作但不是这样。

      当我对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
      

      OUTPUT :存在

      预期输出:不存在

      我可以请一点帮助吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:-1)

DECLARE @RowId INT

从患者中选择RowId的DECLARE CurRowId CURSOR

OPEN CurRowId

FETCH NEXT FROM CurRowId INTO @RowId

WHILE @@ FETCH_STATUS = 0

BEGIN

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

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

开始

print'not exists'

end

else

begin

print 'exists'

END

FETCH  NEXT FROM CurRowId INTO @RowId

END