完全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帖子,但我找不到另一个弥补差距的帖子。
提前致谢!
答案 0 :(得分:2)
结合卢克答案和斯坦斯评论的建议 - 你可能想要这样的东西。
您的查询中还有另一个错误,一旦修复第一个错误就会变得明显。 t.TRIP_START
和t.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”。“旅行”