2查询相同的逻辑但不同的编号。输出行

时间:2014-04-29 06:02:29

标签: sql sql-server-2008 tsql

我有2个查询,它们都旨在选择遵循3个条件的所有batchNo:

  1. ClaimStatus必须为95或90
  2. CreatedBy = ProviderLink
  3. 最小日期更新应该是从昨天下午3点到运行此查询
  4. 查询1:输出940行

    SELECT 
        DISTINCT bh.BatchNo, 
        bh.Coverage, 
        DateUploaded = MIN(csa.DateUpdated) 
    FROM 
        Registration2..BatchHeader bh with(nolock)
        INNER JOIN ClaimsProcess..BatchHeader bhc with(nolock) on bhc.BatchNo = bh.BatchNo
        INNER JOIN ClaimsInfo ci with(nolock) on ci.BatchNo = bhc.BatchNo
        INNER JOIN Claims c with(nolock) on c.ClaimNo = ci.ClaimNo
        INNER JOIN ClaimStatusAudit csa WITH(NOLOCK) on csa.CLAIMNO = ci.ClaimNo 
    WHERE c.ClaimStatus in('95','90') AND bhc.CreatedBy = 'PROVIDERLINK' 
    GROUP BY bh.BatchNo, bh.Coverage
    HAVING MIN(CSA.DateUpdated) >= convert(varchar(10),GETDATE() -1,110) + ' 15:00:00.000' 
    

    查询2:输出1314行

    SELECT 
        DISTINCT bh.BatchNo, 
        bh.Coverage 
    FROM Registration2..BatchHeader bh with(nolock)
        INNER JOIN ClaimsProcess..BatchHeader bhc with(nolock) on bhc.BatchNo = bh.BatchNo
        INNER JOIN ClaimsInfo ci with(nolock) on ci.BatchNo = bhc.BatchNo
        INNER JOIN Claims c with(nolock) on c.ClaimNo = ci.ClaimNo  
    WHERE c.ClaimStatus in('95','90') AND bhc.CreatedBy = 'PROVIDERLINK'
        AND (SELECT MIN(DATEUPDATED) FROM CLAIMSTATUSAUDIT WITH(NOLOCK)WHERE CLAIMNO = ci.ClaimNo) >= convert(varchar(10),GETDATE() -1,110) + ' 15:00:00.000'
    

    虽然两者都有相同的逻辑......但它们输出的行数不同...... 我想知道两者中哪一行更准确......

    BTW ..两个输出都遵循3个给定条件。

1 个答案:

答案 0 :(得分:1)

你的假设是错误的。这两个查询采用相同的逻辑,这仅仅是因为评估每个子句的顺序。条款按以下顺序进行评估(完整文章见here):

  1. 其中
  2. 分组依据
  3. 具有
  4. 选择
  5. 按订单排序
  6. 将详细信息放在一边,让我们分析为什么这两个查询会返回不同数量的行。

    您返回不同行数的原因是 时您正在 之后的之前的日期进行过滤今天下午3点。

    在查询1中,您选择满足两个条件的所有批号和覆盖范围: 1.在所有连接表中都有相应的记录 2.具有所需的声明状态,由" ProviderLink"

    创建

    一旦执行了From,Where和Group by子句,就会得到这个记录列表。

    然后,您正在对该组数据运行汇总计算(Min),提取最低DateUpdated,但您 尚未 对DateUpdated的方式施加任何限制应该是有限的。因此,当您使用Having子句对数据进行分组并过滤组时,您将过滤符合上述数字1和2的条件的所有记录,并且今天下午3点之前还有DateUpdated 。让我们来看一个例子。

    记录1包含BatchNo 123和Coverage A,最后更新时间为2014年4月4日12:00:00.000

    记录2有BatchNo 123和Coverage A,最后更新于今天5/1/2014 3:01:00.000

    假设记录1&如果图2中的所有连接表中具有相应的记录,则查询1将回退不同的BatchNo和Coverage(分别为123& A)并找到最小的DateUpdated,即4/4/2014 12:00:00.000。然后,一旦分组,你的Having子句会说DateUpdated不会比今天下午3点更大,所以它会过滤掉分组记录。

    另一方面,查询2采用了不同的方法。根据BatchNo& amp; amp; amp; amp; amp;覆盖范围,因为这些值是相同的。但是,在where子句(即初始过滤过程)中,它只查找最小DateUpdated大于今天下午3点的记录,因此它找到记录2,并将其返回到数据集。

    我想您会发现数据集1中有374条缺失记录的情况。

    所有这一切,并且由于我们无法告诉您哪个数据集更好,您会发现查询1只会显示不同BatchNos&组的组。覆盖该组的任何记录中的最小DateUpdated的覆盖范围是在今天下午3点之后最后更新的。这意味着查询1仅返回包含非常新记录的BatchNos和Coverage。

    查询2返回任何不同的BatchNo&覆盖范围分组,其组内的任何记录在今天下午3点之后最后更新。哪一个适合你?