簡體   English   中英

MS Access和SSMS從完全相同的查詢返回不同的記錄數

[英]MS Access and SSMS return different # of records from exact same query

請在我發瘋之前幫助我。 我正在使用SSMS 2008 R2和MS Access 2010。

我正在從某人構建的Access數據庫中獲取查詢,並將其放入SSMS中,最終成為存儲過程。 在大多數情況下,這只是修復Access的語法特征而已,並且已完成。 但是有些總是給我不同的結果,我無法確定原因。 這是一個這樣的查詢。 這是SSMS版本。

SELECT DISTINCT
 a.ACCOUNT_NUMBER
,a.INVESTOR_CODE
,a.APPLICATION_PROCESS_STATUS
,i.DOCUMENT_INTAKE_START_DATE
,a.APPLICATION_TYPE_DESC
,p.DECISION_STATUS_DESC
,p.DECISION_STATUS_DATE
,p.DECISION_PROCESS_STATUS
,a.INVESTOR_NAME
FROM        V_Application_Process a
LEFT JOIN   V_Document_Intake_Process i ON a.APPLICATION_ID = i.APPLICATION_ID
LEFT JOIN   V_Decision_Process p ON a.APPLICATION_ID = p.APPLICATION_ID

當我在SSMS中運行此程序時,我得到107614結果。 當我在Access中運行它時,我得到90848 我將粘貼查詢的Access版本:

SELECT DISTINCT
 dbo_V_Application_Process.ACCOUNT_NUMBER
,dbo_V_Application_Process.INVESTOR_CODE
,dbo_V_Application_Process.APPLICATION_PROCESS_STATUS
,dbo_V_Document_Intake_Process.DOCUMENT_INTAKE_START_DATE
,dbo_V_Application_Process.APPLICATION_TYPE_DESC
,dbo_V_Decision_Process.DECISION_STATUS_DESC
,dbo_V_Decision_Process.DECISION_STATUS_DATE
,dbo_V_Decision_Process.DECISION_PROCESS_STATUS
,dbo_V_Application_Process.INVESTOR_NAME

FROM
((dbo_V_Application_Process
LEFT JOIN dbo_V_Document_Intake_Process
ON dbo_V_Application_Process.APPLICATION_ID = dbo_V_Document_Intake_Process.APPLICATION_ID)
LEFT JOIN dbo_V_Decision_Process
ON dbo_V_Application_Process.APPLICATION_ID = dbo_V_Decision_Process.APPLICATION_ID)

我已經通過執行SELECT * FROM V_Application_Process etc.對每個視圖進行了比較,並將其與Access查詢所基於的傳遞(與那些非常相同的視圖的傳遞連接)進行了比較,並且它們始終返回完全相同的結果。 因此,查詢所基於的視圖是相同的,但是以相同的方式將它們放在一起並得到不同的結果。

有人知道為什么嗎?

編輯

好的,所以我注意到,當所有三個視圖都在Access中聯接時(SSMS很好),一個不應為NULL的字段為NULL。 因此,在Access中,我進行了一個測試查詢,並在應用程序ID上加入了APplication Process和Document Intake Process視圖。 我使用了一個測試帳戶。 工作正常。 然后,我對應用程序流程和決策流程視圖與應用程序ID進行了另一個連接。 它工作正常。 最后,我加入了有關應用程序ID的所有三個表。 在這個測試帳戶上,當我這樣做時,結果為零。 因此,在您將三個輸入混合之前,視圖上的連接非常有效,我也不知道為什么。

除了Andre所說的以外,如何用聯接中使用的所有主鍵ID字段替換SELECT子句中的所有列。 這還會帶來不同的結果嗎?

如果是這樣,請確定缺少的行,並查看它們是否有共同之處。

我剛剛注意到您所有表的開頭都為dbo_。 對於直通查詢,我期望使用dbo。 (有關更多信息,請參見此網頁

這告訴我您的SQL Server查詢未在SQL Server上運行,但是我認為它使用的是從訪問鏈接到SQL Server的表,這些表都以dbo_開頭

這將帶來其他可能的問題(即ODBC驅動程序以及已將哪些列設置為鏈接表的主鍵-我認為)。

第2部分:

請注意,與其像下面這樣編寫訪問查詢,不如將下面的查詢創建為SQL Server上的視圖,然后“鏈接到”訪問中的視圖,這將更好。 這樣,SQL Server將完成更多的處理,並且傳輸的數據更少。

這是Access查詢的重新格式化版本(帶別名)

SELECT DISTINCT vAP.ACCOUNT_NUMBER
              , vAP.INVESTOR_CODE
              , vAP.APPLICATION_PROCESS_STATUS
              , vDIP.DOCUMENT_INTAKE_START_DATE
              , vAP.APPLICATION_TYPE_DESC
              , vDP.DECISION_STATUS_DESC
              , vDP.DECISION_STATUS_DATE
              , vDP.DECISION_PROCESS_STATUS
              , vAP.INVESTOR_NAME

SELECT DISTINCT vAP.APPLICATION_ID
              , vDIP.APPLICATION_ID
              , vDP.APPLICATION_ID

           FROM ((dbo_V_Application_Process AS vAP
                      LEFT JOIN dbo_V_Document_Intake_Process AS vDIP
                             ON vAP.APPLICATION_ID = vDIP.APPLICATION_ID
                 )
                 LEFT JOIN dbo_V_Decision_Process AS vDP
                        ON vAP.APPLICATION_ID = vDP.APPLICATION_ID)

如果從兩個查詢中刪除DISTINCT ,得到的結果數是否相同?

如果是的話,我的猜測是某些SQL Server數據類型在Access中沒有完全相同的值,因此也許某些在SQL Server中不同的值被映射為Access中的相同值,因此它們的記錄變得相同,因此被DISTINCT刪除。

我的第一個嫌疑人是日期字段。 您在SQL Server中使用哪種數據類型?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM