我有2个查询,它们都旨在选择遵循3个条件的所有batchNo:
查询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个给定条件。
答案 0 :(得分:1)
你的假设是错误的。这两个查询不采用相同的逻辑,这仅仅是因为评估每个子句的顺序。条款按以下顺序进行评估(完整文章见here):
将详细信息放在一边,让我们分析为什么这两个查询会返回不同数量的行。
您返回不同行数的原因是 时您正在 之后的之前的日期进行过滤今天下午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点之后最后更新。哪一个适合你?