SQL Server外部联接结果受WHERE条件限制

时间:2018-09-11 20:56:14

标签: sql sql-server outer-join

我有2个SQL Server数据库表,这些表正在设计用于使用Crystal Reports的报告。第一个表列出了所有受理申请的办公室,第二个表列出了所有申请的列表。

我正在设计的报告应该显示所有办公室的标题(之所以需要显示是因为存在一个单独的子报表,该子报表位于CR的每个部分下)。然后,该报告提供了迄今为止已收到的所有申请的总数。在我添加WHERE子句以限制2018年使用的应用程序之前,SQL查询工作正常,然后仅向我显示在2018年拥有应用程序的办公室。

根据我在寻找答案时所发现的信息,一旦在右侧表格中添加了日期条件,SQL便将OUTER JOIN视为INNER JOIN,因此我认为情况确实如此。但是,如果我不考虑日期标准,那么显然我会收到所有的申请……。我试图找出是否遗漏了一些明显的东西,或者是否需要使用其他类型的SQL查询来完成所需的内容。

这是我目前正在使用的查询,对于如何实现此功能,我们将不胜感激。

SELECT office.src_office_id
FROM source_office office
FULL OUTER JOIN  credit_application app ON app.src_office_id = office.src_office_id
WHERE office.src_office_id IS NOT NULL OR
  (app.delete_app=0
   AND (app.data_entry_complete >= {ts '2018-01-01 00:00:00'} 
   AND app.data_entry_complete < {ts '2018-09-11 00:00:00'}))
ORDER BY office.src_office_id ASC

1 个答案:

答案 0 :(得分:0)

WHERE office.src_office_id IS NOT NULL

在这种情况下,这不会做任何事情,因为您已经在使用外部联接过滤掉不存在的office.src_office_id

您可以进行左联接,并使用联接本身添加日期过滤器

LEFT JOIN 
  credit_application app 
    ON app.src_office_id = office.src_office_id 
    AND app.delete_app=0 
    AND (app.data_entry_complete >= {ts '2018-01-01 00:00:00'} 
    AND app.data_entry_complete < {ts '2018-09-11 00:00:00'}

然后做

WHERE office.src_office_id IS NOT NULL

很抱歉,语法错误,希望您理解我的意思,您将根据日期将办公室和应用程序加载到集合中,然后在没有办公室的情况下过滤掉这些应用程序。