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

Sql Oracle在两个不同的模式之间左连接日期,sql,oracle,left-join,database-schema,Sql,Oracle,Left Join,Database Schema,完全是SQL新手,试图将我的一个R查询转换为Oracle SQL查询-如果我的术语错误,我深表歉意,但我会尽量明确 在Windows上使用Oracle SQL Developer 4.0.3.16 我正试图根据日期范围和许可证ID从两个不同的模式(SCA和schB)连接表(“VM”和“TRIP”)。我想进行左连接(保留schA.VMS中的所有行,仅保留schB中的TRIP_连接字段……当日期不匹配时,在TRIP_连接字段中保留NA) 两个schema.table的说明: describe sc

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

在Windows上使用Oracle SQL Developer 4.0.3.16

我正试图根据日期范围和许可证ID从两个不同的模式(SCA和schB)连接表(“VM”和“TRIP”)。我想进行左连接(保留schA.VMS中的所有行,仅保留schB中的TRIP_连接字段……当日期不匹配时,在TRIP_连接字段中保留NA)

两个schema.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技能还不完全具备。抱歉,希望我的错误没有一个是显而易见的

我为我的问题的不同部分找到了如此多的帖子,但我找不到另一个能够完全弥合差距的帖子


提前谢谢

您在尝试选择“schB”“TRIP”“TRIP\U END”时出错,因为您尚未加入“schB”“TRIP”

您在尝试选择“schB”“TRIP”“TRIP”“TRIP\U END”时出错,因为您尚未加入“schB”“TRIP”

结合Luke的回答和sstan的评论,你可能想要这样的东西

您的查询中还有另一个错误,一旦修复了第一个错误,这一错误就会变得很明显
t.TRIP\u START
t.TRIP\u END
是日期,但您将它们包装在
to\u 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
;

结合Luke的回答和sstan的评论,你可能想要这样的东西

您的查询中还有另一个错误,一旦修复了第一个错误,这一错误就会变得很明显
t.TRIP\u START
t.TRIP\u END
是日期,但您将它们包装在
to\u 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
;

您的查询正在对
schA.VMS
来自schA.VMS
左连接schA.VMS
)执行自连接。您根本就没有加入
schB.TRIP
,因此您不能参考该表。验证您的
from
join
子句。此外,通过使用表别名,您可以大大简化查询。当提供解释时,向下投票更有建设性,这样像我这样的新手可以改进未来的问题。谢谢您的查询正在对
schA.VMS
来自schA.VMS
左连接schA.VMS
)执行自连接。您根本就没有加入
schB.TRIP
,因此您不能参考该表。验证您的
from
join
子句。此外,通过使用表别名,您可以大大简化查询。当提供解释时,向下投票更有建设性,这样像我这样的新手可以改进未来的问题。谢谢谢谢-我已经接受了卢克的答案,这似乎很有效,但我非常感谢更详细的答案(我相信其他人也一样)(+1)。我删除了to_date(),它似乎没有改变结果,但是,如果没有to_date(),它会快一个数量级,所以这很好!性能的提高表明您在TRIP_START和TRIP_END上有索引(您可能应该这样做)。将它们包装在函数调用中可以防止使用这些索引;正确写入条件并使用索引!很高兴这有帮助。谢谢-我已经接受了卢克的答案,这似乎是可行的,但我非常感谢更详细的答案(我相信其他人也一样)(+1)。我删除了to_date(),它似乎没有改变结果,但是,如果没有to_date(),它会快一个数量级,所以这很好!性能的提高表明您在TRIP_START和TRIP_END上有索引(您可能应该这样做)。将它们包装在函数调用中可以防止使用这些索引;正确写入条件并使用索引!很高兴这有帮助。一旦我解决了这个问题,有没有明显的原因让我无法从正确的表中获取空值?我似乎只得到它们匹配的行,这在我微薄的理解中是一个内部连接,而不是左连接。这似乎是对的吗?这是不对的,它是由WHERE子句引起的,WHERE子句应该在JOIN的ON子句中。我将更新我的答案以反映这一点。一旦我解决了这个问题,是否有明显的原因使我无法从正确的表中获取空值?我似乎只得到它们匹配的行,这在我微薄的理解中是一个内部连接,而不是左连接。这似乎是对的吗?这是不对的,它是由WHERE子句引起的,WHERE子句应该在JOIN的ON子句中。我将更新我的答案以反映这一点。