SQL 服务器 OUTER JOIN 结果受 WHERE 条件限制
SQL Server OUTER JOIN results limited by WHERE criteria
我有 2 个 SQL 服务器数据库 table,我正在设计一个使用 Crystal 报告的报告。第一个 table 提供所有受理申请的办公室列表,第二个提供所有申请的列表。
我正在设计的报告应该显示 headers 所有办公室(需要存在,因为在 CR 中的每个部分下都有一个单独的子报告)。该报告然后提供已收到的任何申请的总数 year-to-date。 SQL 查询工作正常,直到我添加 WHERE 子句以限制 2018 年的申请——然后它只显示 2018 年有申请的办公室。
根据我在搜索答案时发现的内容,一旦添加了 right-hand table 上的日期标准,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
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
对不起,语法错误,希望你能理解我的意思,你会根据日期加载到一组办公室和应用程序中,然后过滤掉那些没有办公室的应用程序。
我有 2 个 SQL 服务器数据库 table,我正在设计一个使用 Crystal 报告的报告。第一个 table 提供所有受理申请的办公室列表,第二个提供所有申请的列表。
我正在设计的报告应该显示 headers 所有办公室(需要存在,因为在 CR 中的每个部分下都有一个单独的子报告)。该报告然后提供已收到的任何申请的总数 year-to-date。 SQL 查询工作正常,直到我添加 WHERE 子句以限制 2018 年的申请——然后它只显示 2018 年有申请的办公室。
根据我在搜索答案时发现的内容,一旦添加了 right-hand table 上的日期标准,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
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
对不起,语法错误,希望你能理解我的意思,你会根据日期加载到一组办公室和应用程序中,然后过滤掉那些没有办公室的应用程序。