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_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
;
完全 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_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
;