在我的一个用例中,我有两个表,即flow和conf。flow表包含所有飞行数据的列表。它有creationdate、datafilename、aircraftid列。conf表包含配置信息。它有configdate、aircraftid、ConfigurationName列。为一种飞机类型创建了多个配置版本。因此,当我们处理一个datafilename时,我们需要从flow表中识别aircraftid,并从conf表中提取在datafilename创建之前创建的配置。所以,我试过这个,
FROM (
SELECT
F_FILE_CREATION_DATE,
F_FILE_ARCHIVED_RELATIVE_PATH,
F_FILE_ARCHIVED_NAME,
K_AIRCRAFT
from T_FLOW f )x left join
(
select c.config_date, c.aircraft_id, c.configurationfrom t_conf c
) y on y.aircraft_id = x.K_AIRCRAFT
select
x.F_FILE_CREATION_DATE,
x.F_FILE_ARCHIVED_RELATIVE_PATH,
x.F_FILE_ARCHIVED_NAME,
x.K_AIRCRAFT,
y.config_date,
y.aircraft_id,
y.configuration;
这将获取为飞机创建的所有配置,这是显而易见的,因为没有条件检查conf.config\u date<flow.f\u file\u creation\u date。我试着把这种情况包括在内,
FROM (
SELECT
F_FILE_CREATION_DATE,
F_FILE_ARCHIVED_RELATIVE_PATH,
F_FILE_ARCHIVED_NAME,
K_AIRCRAFT
from T_FLOW f )x join
(
select c.config_date, c.aircraft_id, c.FILEFILTER from t_conf c
) y on y.aircraft_id = x.K_AIRCRAFT where y.config_date < x.f_file_creation_date
select
x.F_FILE_CREATION_DATE,
x.F_FILE_ARCHIVED_RELATIVE_PATH,
x.F_FILE_ARCHIVED_NAME,
x.K_AIRCRAFT,
y.config_date,
y.aircraft_id,
y.filefilter;
这次失败了,出现了错误
required (...)+ loop did not match anything at input 'where' in statement
有人能给我一个或两个提示我哪里出了问题,以及如何解决这个问题吗?
2条答案
按热度按时间am46iovg1#
我无法重现你的错误。我想你的问题是正确的。你用什么版本的Hive?我用Hive2.1.1测试了这个查询。
xdyibdwo2#
请仔细阅读
发布问题
发布数据相关问题时-
提供数据样本:源数据+所需结果。
这将比你给出的任何解释都要清楚。它还将为进一步讨论提供一个共同的背景,并为您和其他人验证给定解决方案的正确性提供一种方法。
提供表的大小属性(记录/卷)。
考虑到ans可能影响给定解决方案的性能,这一点很重要。
sql语句
配置单元当前不支持equijoin以外的任何连接条件类型(例如。
t1.X = t2.X and t1.Y = t2.Y
). 这就是为什么你会出错。如果要进行内部联接(而不是外部联接),则可以将非等分联接条件移动到where子句。
坚持isosql标准。sql子句有一个常规的顺序:从where中选择。。。
除了深奥的错误消息之外,您从深奥的语法中什么也得不到。
没有任何理由使用子查询来缩小列列表的范围。
只想说清楚一点-这样做并没有任何性能提升。更重要的是,如果它能像你想象的那样工作(而且它没有),那么性能会更差,而不是更好。