【问题标题】:SQL Server OUTER JOIN results limited by WHERE criteria [duplicate]SQL Server OUTER JOIN 结果受 WHERE 条件限制[重复]
【发布时间】:2019-02-16 10:34:42
【问题描述】:

我有 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

【问题讨论】:

  • 据我了解,您需要外部连接。但是,通过说office.src_office_id IS NOT NULL,您基本上可以使其成为正确的连接,但第二个条件捕获的条目除外。您可能想删除 NOT
  • 如果您编辑了您的问题并描述了架构(如CREATE TABLE 语句)以及示例数据(如INSERT 语句)以及您对该示例的期望结果,这将更容易为您提供帮助数据。
  • 嗨。了解返回时的左连接:行上的内连接以及由空值扩展的不匹配的左表行。作为左连接的一部分,始终知道您想要什么内连接。在您拥有的左连接之后,需要右表列不为空的地方会删除任何由空值扩展的行,即仅在行上保留内连接,即“将外连接变为内连接”。
  • 这是一个常见问题解答。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用一个变体搜索您的标题和关键字作为您的标签。请参阅向下投票箭头鼠标悬停文本。
  • @NielsNet 不是那个 NULL 测试删除了空扩展行,它是 OR 要求正确的表列是非空的。 (请参阅已接受的答案。)当然,通常是右表列的 IS NOT NULL,这是这些常见问题解答“将外部联接变为内部联接”的方式。

标签: sql sql-server outer-join


【解决方案1】:
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

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

【讨论】:

  • 这实际上工作得很好,并且提供了我正在寻找的结果!谢谢!!
猜你喜欢
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 2010-11-26
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多