当前位置: 首页 > 知识库问答 >
问题:

Oracle-带where子句的左外部联接

湛博易
2023-03-14

我将两个表上的连接定义为左外部连接,以便所有记录都从左表返回,即使它们在右表中没有记录。不过,我还需要包含一个where子句,但是...即使不满足where子句中的条件,我仍然希望为左侧表中的每个记录返回左侧表中的一行。有办法做到这一点吗?

我正在编写带有联接条件的查询,如下所示

SELECT A.*, B.* 
FROM A 
LEFT OUTER JOIN B ON A.VIN = B.VIN AND 
TRUNC(a.REP_OPEN_DATE) BETWEEN TRUNC(b.CHECK_IN_DATE)+1 AND TRUNC(b.CHECK_IN_DATE)-1

以上条件不返回任何行。其中如下条件返回...

SELECT A.*, B.* 
FROM A 
LEFT OUTER JOIN B ON A.VIN = B.VIN
TRUNC(a.REP_OPEN_DATE) BETWEEN TRUNC(b.CHECK_IN_DATE)+1 AND TRUNC(b.CHECK_IN_DATE)-1
VIN    | RO_OPEN_DATE
1234   | 04-NOV-13
6789   | 09-NOV-13
VIN    | CHECK_IN_DATE
1234   | 09-NOV-13
1234   | 05-NOV-13
6789   | 20-OCT-14
6789   | 29-OCT-14

输出应为

   VIN     | RO_OPEN_DATE  | CHECK_IN_DATE
   1234    | 04-NOV-13     | 05-NOV-13
   6789    | 09-NOV-13     | NULL

条件:-对于VIN的每个RO_OPEN_DATE,我们需要检查从RO_OPEN_DATE起是否有+/-1天的CHECK_IN_DATE。

共有1个答案

轩辕远
2023-03-14

您的解释与您的查询不相关。你提到过

“然而,我还需要包含一个where子句,但是...即使不满足where子句中的条件,我仍然希望为左侧表中的每个记录返回左侧表中的一行。”

因此我相信您的查询如下所示

SELECT a.*, 
       b.* 
FROM   a 
       LEFT OUTER JOIN b 
                    ON a.vin = b.vin 
WHERE  Trunc(a.rep_open_date) BETWEEN Trunc(b.check_in_date) + 1 AND 
                                      Trunc(b.check_in_date) - 1 
SELECT a.*, 
       b.* 
FROM   a 
       left outer join b 
                    ON a.vin = b.vin 
                       AND Trunc(a.rep_open_date) BETWEEN 
                           Trunc(b.check_in_date) + 1 AND 
                           Trunc(b.check_in_date) - 1 
SELECT a.*, 
       b.* 
FROM   a 
       left outer join b 
                    ON a.vin = b.vin 
                       AND CAST(a.rep_open_date as date) BETWEEN 
                           CAST(b.check_in_date as date) - 1 AND 
                           CAST(b.check_in_date as date) + 1 
 类似资料:
  • 问题内容: 我在定义为左外部联接的两个表上有一个联接,以便所有记录都从左表返回,即使它们在右表中没有记录也是如此。但是,我还需要在右侧表中的字段上包含where子句,但是....我仍然希望为左侧表中的每个记录返回左侧表中的一行,即使where子句中的条件不满足。有没有办法做到这一点? 问题答案: 是的,将条件(称为谓词)放入联接条件中

  • 问题内容: 我正在尝试比较两个表以在每个表中找到不在另一个表中的行。表1的groupby列用于在表1中创建2组数据。 表2只有一栏。 因此,表1在组2中具有值1,2,4,表2具有值1,3,4。 加入第2组时,我期望得到以下结果: 我可以使它起作用的唯一方法是在第一个联接中放置where子句: 第二个在“打开”中有一个过滤器: 谁能提出一种不在on子句中而是在where子句中使用过滤器的方法? 上下

  • 主要内容:Oracle WHERE子句简介,Oracle WHERE示例在本教程中将学习如何使用Oracle 子句来指定过滤的条件返回符合查询条件的行记录。 Oracle WHERE子句简介 子句指定语句返回符合搜索条件的行记录。下面说明了子句的语法: 子句出现在子句之后但在ORDER BY子句之前。在WHERE关键字之后是 - 它定义了返回行记录必须满足的条件。 除了语句之外,还可以使用DELETE或UPDATE语句中的子句来指定要更新或删除的行记录。 Oracle

  • 在oracle数据库上似乎有很多查询语法来获取数据,这里我只想问一下运行良好的查询,但我完全不明白。查询如下: 从上面的查询来看,它的工作很好。但是我不明白为什么会有TO_DATE('01/01/197000:00:00','mm/dd/yyyy hh24:mi:ss和(create_date/(60*60*24)),'mm/dd/yy hh24:mi:ss') 有人能解释一下吗? 提前致谢

  • 问题内容: 我有以下SQL代码(这是到目前为止我得到了多少): 以下是VIEW_1的定义: 但是我收到以下错误消息: 是什么导致错误?在哪里更改代码以使其起作用? 感谢您的帮助! 问题答案: 以我的经验,不仅在USING子句为MATCH表中的一行返回一行以上时,而且在无法 确定 仅返回一行(即使没有实际的行)时,也会返回此错误。返回多行的情况)。为了在这种情况下强制解析器接受查询,我通常会在MAT

  • 问题内容: 我有一个网站,用户可以在其中查看电影列表,并为其创建评论。 用户应该能够看到所有电影的列表。此外,如果他们查看了电影,则他们应该能够看到他们给它的评分。如果不是,则仅显示没有得分的电影。 他们根本不在乎其他用户提供的分数。 考虑以下 我本质上想要的是 考虑以下内容: 两个测试都应打印完全相同的输出,但是,只有原始版本会吐出正确的结果表: orm会返回这个 任何试图加入其余主题的尝试,那