Oracle在两个不同的模式之间连接日期

时间:2016-07-26 20:55:12

标签: sql oracle left-join database-schema

完全SQL新手尝试将我的一个R查询转换为Oracle SQL查询 - 如果我的术语错误但我会尝试明确表示道歉。

在Windows上使用Oracle SQL Developer 4.0.3.16。

我正在尝试根据日期范围和许可ID从两个不同的模式(schA和schB)加入表格(" VMS"和#34; TRIP")。我想做一个左连接(保留schA.VMS的所有行,只保留schB的TRIP_JOIN字段......当日期不匹配时,在TRIP_JOIN字段中保留NA)。

两个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帖子,但我找不到另一个弥补差距的帖子。

提前致谢!

2 个答案:

答案 0 :(得分:2)

结合卢克答案和斯坦斯评论的建议 - 你可能想要这样的东西。

您的查询中还有另一个错误,一旦修复第一个错误就会变得明显。 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
;

答案 1 :(得分:1)

当您尝试选择“schB”时出现错误。“TRIP”。“TRIP_END”因为您尚未加入“schB”。“旅行”