我需要比较并找到来自两个不同Oracle数据库的多个列的百分比错误。 DB1 DATE_TIME列只有日期,没有时间(DD-MON-YY),DB2 DATE_TIME列有日期和时间。每行代表一小时,DB1按小时按正确顺序排列,但没有实际时间。需要相关的列来匹配id和date_time(特别是小时),但是我发现测试DATE相等性的WHERE子句只会给出对应于12:00:00 AM的DB1条目,因为没有时间DB1中日期格式的一部分,所以我无法比较其他时间的正确条目。我怎么能绕过这个?
以下代码更好地说明:
SELECT db1.field1, db2.field1, db1.date_time, db2.date_time
FROM db1, db2
WHERE db1.date_time = db2.date_time AND db1.id = X
ORDER BY db2.date_time DESC;
此查询运行,但没有数据实际匹配,因为它只返回DB1中每天的第一行(对应于12:00:00 AM)。
我已经想过以某种方式在DB1 DATE_TIME列中根据位置插入相应的时间戳,这样我就可以在WHERE中包含时间,但不知道该怎么做,或者它是否会起作用。我已经看到使用BETWEEN day1和day2(而不是=)运行测试查询会在给定的天数内返回我想要的结果,但我不确定如何在JOIN中实现我想要的做DB2。
有什么想法吗?
答案 0 :(得分:0)
如果您关心性能,我建议您在db2
上创建基于函数的索引:
create index idx_db2_datetime_date on db2(trunc(datetime));
然后,您可以在查询中使用此构造:
SELECT db1.field1, db2.field1, db1.date_time, db2.date_time
FROM db1 JOIN
db2
ON db1.date_time = trunc(db2.date_time)
WHERE db1.id = X
ORDER BY db2.date_time DESC;
对于此查询,db1(id, date_time)
上的索引也很有帮助。
查询无需索引,但基于函数的索引是使用ON
子句中的函数编写性能查询的好方法。
注意:学习使用正确的,明确的JOIN
语法。切勿在{{1}}子句中使用逗号。
答案 1 :(得分:0)
对于SELECT
,您可能需要尝试:
SELECT db1_.field1, db2.field1, db1_.date_time, db2.date_time
FROM (
SELECT
id
, field1
, date_time + (RANK() OVER (PARTITION BY date_time ORDER BY id - 1) / 24 date_time
FROM DB1
) DB1_
JOIN db2
ON db1.date_time = TRUNC(db2.date_time, 'HH24')
AND db1.id = X
ORDER BY db2.date_time DESC;
如果您希望将小时数添加到 DB1.date_time ,请尝试:
UPDATE
DB1 TDB1
SET TDB1.date_time =
(SELECT
d_t
FROM
(SELECT
id
, (date_time + (RANK() OVER (PARTITION BY date_time ORDER BY id) - 1) / 24) d_t
FROM DB1)
WHERE id = TD1.id
) DB1
;
很抱歉,此时没有合适的测试数据可以完整验证。
请评论是否需要调整/进一步详细说明。