MS Access 和 SSMS return 来自完全相同查询的不同记录数
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 查询所基于的直通(它们是与那些完全相同的视图的直通连接)进行了比较,它们总是 return完全相同的结果。因此,查询所基于的视图是相同的,但以相同的方式将它们放在一起会得到不同的结果。
有人知道为什么吗?
编辑
好的,所以我注意到当所有这三个视图都加入 Access 时,一个不应为 NULL 的字段为 NULL(SSMS 可以)。因此,在 Access 中,我使用在应用程序 ID 上加入的申请流程和文档接收流程视图进行了测试查询。我用了一个测试账号。它工作正常。然后,我对应用程序 ID 加入了应用程序流程和决策流程视图。它工作正常。最后,我在应用程序 ID 上加入了所有三个表。在这个测试帐户上,当我这样做时,我得到零结果。因此,在您将三个视图混合在一起之前,视图上的连接效果很好,我不知道为什么。
如果从两个查询中删除 DISTINCT
,会得到相同数量的结果吗?
如果是,我的猜测是某些 SQL 服务器数据类型在 Access 中没有完全相同的数据类型,因此可能某些 SQL 服务器中不同的值映射到 Access 中的相同值,因此他们的记录变得相同,因此被 DISTINCT 删除。
我的第一个怀疑是 日期 字段。您在 SQL 服务器中为他们使用哪种数据类型?
补充一下 Andre 所说的,如何将 SELECT 子句中的所有列替换为连接中使用的所有主键 ID 字段。这还会给出不同的结果吗?
如果是,找出缺失的行,看看它们是否有任何共同点。
我刚刚注意到您所有的表都以 dbo_ 开头。对于传递查询,我期待 dbo。 (见 this webpage for more info )
这告诉我你的 SQL 服务器查询不是 运行 在 SQL 服务器上,但我认为它正在使用你链接到 SQL 服务器的表来自所有以dbo_
开头的访问
这将带来其他可能的问题(即 ODBC 驱动程序以及哪些列已设置为链接表的主键 - 我认为)。
第 2 部分:
请注意,与其像下面这样编写访问查询,不如将下面的查询创建为 SQL 服务器上的视图,然后 "link to" 访问中的视图。这样 SQL 服务器将做更多的处理,更少的数据传输到访问。
这是您的 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)
请在我发疯之前帮助我。我正在使用 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 查询所基于的直通(它们是与那些完全相同的视图的直通连接)进行了比较,它们总是 return完全相同的结果。因此,查询所基于的视图是相同的,但以相同的方式将它们放在一起会得到不同的结果。
有人知道为什么吗?
编辑
好的,所以我注意到当所有这三个视图都加入 Access 时,一个不应为 NULL 的字段为 NULL(SSMS 可以)。因此,在 Access 中,我使用在应用程序 ID 上加入的申请流程和文档接收流程视图进行了测试查询。我用了一个测试账号。它工作正常。然后,我对应用程序 ID 加入了应用程序流程和决策流程视图。它工作正常。最后,我在应用程序 ID 上加入了所有三个表。在这个测试帐户上,当我这样做时,我得到零结果。因此,在您将三个视图混合在一起之前,视图上的连接效果很好,我不知道为什么。
如果从两个查询中删除 DISTINCT
,会得到相同数量的结果吗?
如果是,我的猜测是某些 SQL 服务器数据类型在 Access 中没有完全相同的数据类型,因此可能某些 SQL 服务器中不同的值映射到 Access 中的相同值,因此他们的记录变得相同,因此被 DISTINCT 删除。
我的第一个怀疑是 日期 字段。您在 SQL 服务器中为他们使用哪种数据类型?
补充一下 Andre 所说的,如何将 SELECT 子句中的所有列替换为连接中使用的所有主键 ID 字段。这还会给出不同的结果吗?
如果是,找出缺失的行,看看它们是否有任何共同点。
我刚刚注意到您所有的表都以 dbo_ 开头。对于传递查询,我期待 dbo。 (见 this webpage for more info )
这告诉我你的 SQL 服务器查询不是 运行 在 SQL 服务器上,但我认为它正在使用你链接到 SQL 服务器的表来自所有以dbo_
开头的访问这将带来其他可能的问题(即 ODBC 驱动程序以及哪些列已设置为链接表的主键 - 我认为)。
第 2 部分:
请注意,与其像下面这样编写访问查询,不如将下面的查询创建为 SQL 服务器上的视图,然后 "link to" 访问中的视图。这样 SQL 服务器将做更多的处理,更少的数据传输到访问。
这是您的 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)