Oracle Left 在日期之间加入两个不同的模式

Oracle Left join between dates two different schemas

完全 SQL 新手试图将我的一个 R 查询转换为 Oracle SQL 查询 - 如果我用错了术语,我深表歉意,但我会尽量明确。

在 Windows.

上使用 Oracle SQL Developer 4.0.3.16

我正在尝试根据日期范围和许可 ID 连接来自两个不同模式(schA 和 schB)的表("VMS" 和 "TRIP")。我想进行左连接(保留 schA.VMS 中的所有行,仅保留 schB 中的 TRIP_JOIN 字段...当日期不匹配时,将 NA 留在 TRIP_JOIN 字段中)。

两个的描述schemas.table:

 describe schA.VMS
 Name              Null     Type        
 ----------------- -------- ----------- 
 PERMIT                     NUMBER(6)   
 POSITION_DATETIME NOT NULL DATE        
 LATITUDE      NOT NULL NUMBER(9,6) 
 LONGITUDE     NOT NULL NUMBER(9,6)


 describe schB.TRIP
 Name                       Null     Type         
 -------------------------- -------- ------------ 
 PERMIT                     NOT NULL VARCHAR2(6)  
 TRIP_JOIN                  NOT NULL NUMBER       
 TRIP_START                          DATE         
 TRIP_END                            DATE    

我一直在尝试以下代码的不同版本

alter session set nls_date_format = 'mm/dd/yyyy HH24:MI'

SELECT schA.VMS.*,TRIP_JOIN FROM schA.VMS
  LEFT JOIN schA.VMS 
  ON schA.VMS.POSITION_DATETIME BETWEEN 
     to_date(schB.TRIP.TRIP_START) AND to_date(schB.TRIP.TRIP_END)
  WHERE to_char(schA.VMS.PERMIT) = schB.TRIP.PERMIT

我不断收到此错误消息。我假设我在模式之间指定错误,但我无法弄清楚哪个方面!

ORA-00904: "schB"."TRIP"."TRIP_END": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 20 Column: 115

我试图弄清楚如何提供可重现的示例,但我的 Oracle 技能还不够。抱歉,希望我的错误没有一个就足够明显了!

我找到了针对我的问题的不同部分的 SO 帖子,但我找不到另一个可以弥补差距的帖子。

提前致谢!

您尝试 select "schB"."TRIP"."TRIP_END" 时遇到错误,因为您尚未加入 "schB"."Trip"

结合 Luke 的回答和 sstan 的评论中的建议 - 你可能想要这样的东西。

您的查询中还有另一个错误,一旦您修正了第一个错误就会变得很明显。 t.TRIP_STARTt.TRIP_END 是日期,但是你把它们包在 to_date(). 里面,那肯定会引起麻烦。

SELECT v.*, t.TRIP_JOIN 
FROM schA.VMS v LEFT JOIN schB.TRIP t
  ON v.POSITION_DATETIME BETWEEN t.TRIP_START AND t.TRIP_END  
WHERE to_char(v.PERMIT) = t.PERMIT
;

已编辑:在对另一个答案的评论中,OP 指出,在修复语法错误后,查询似乎执行了内部联接而不是左联接。这是由 WHERE 子句引起的;看来 OP 意味着它是一个附加的连接条件。作为 WHERE 条件,过滤是在连接完成后完成的,它会过滤掉外部连接添加的额外行。为了得到想要的结果,查询应该这样写:

SELECT v.*, t.TRIP_JOIN 
FROM schA.VMS v LEFT JOIN schB.TRIP t
  ON v.POSITION_DATETIME BETWEEN t.TRIP_START AND t.TRIP_END  
 AND to_char(v.PERMIT) = t.PERMIT                       ----   not WHERE
;