Sql-Server-2008

這兩個查詢有什麼區別?

  • May 8, 2020

我們有這兩個查詢:

select jsh.jobid, max(jsh.Audit_CreatedDate)
from JobStatusHistories jsh 
join Jobs j on j.JobId = jsh.JobId
where j.JobStatusId = 11 
and jsh.Audit_CreatedBy <> 'Archiver'
and jsh.Audit_CreatedDate < '5/9/2015'
group by jsh.jobid

select jsh.jobid 
from JobStatusHistories jsh 
join Jobs j on j.JobId = jsh.JobId
where j.JobStatusId = 11 
and jsh.Audit_CreatedBy <> 'Archiver'
group by jsh.jobid
having MAX(jsh.Audit_CreatedDate) < '5/9/2015'

第一個返回 530 萬條記錄,第二個返回 430 萬條記錄。

目標是獲取作業狀態為 11 且已在 5 個多月前(舊)修改但最近可能已被存檔器修改的作業 ID 列表,因此我們希望忽略這些。

簡化的數據可能如下所示:

JobId    Audit_CreatedDate    Audit_CreatedBy
234      3/25/2015            Importer
234      9/25/2015            Archiver
456      8/25/2015            Importer
456      9/25/2015            Archiver
789      3/25/2015            Importer
789      4/25/2015            Archiver

我們希望回來:

JobId    Audit_CreatedDate    
234      3/25/2015            
789      3/25/2015            

不幸的是,這兩個查詢都返回了很多結果,很難看出哪個在做我們想要的。

不同之處在於第一個查詢將包含這樣的作業:

jobId    Audit_CreatedDate
-------  -----------------
1        2015-04-01
1        2015-06-01

第一行將包含在查詢中,但第二行將不包含在內。這是因為該工作中至少有一行符合 where 子句< May 9th(或者是 9 月 5 日?請使用非區域性、明確的日期文字)。

這個相同的作業將完全從第二個查詢中排除,因為過濾器有效地應用於聚合,而不是單獨的行。MAX(date) = June 1st在這種情況下,因此作業被作為一個整體拋出,而不僅僅是 rows > May 9

哪個查詢是正確的?誰知道?您需要提供有關您的實際要求的更多詳細資訊-您目前的單詞問題不夠明確,我無法理解。並不是說任何使用者或客戶端都可以使用 4.3 或 530 萬行。

引用自:https://dba.stackexchange.com/questions/117578