【问题标题】:Redshift - SQL Left Join does not work with correlated subquery and aggregated functionRedshift - SQL Left Join 不适用于相关子查询和聚合函数
【发布时间】:2018-05-26 23:29:39
【问题描述】:

我对 Redshift SQL 还是很陌生,一直试图找出我的语法有什么问题。

我的任务是通过左连接加入 2 个表:questionuser,因为我想保留表 question 中的所有值。

目前它抛出以下错误消息:[Amazon](500310) Invalid operation: This type of correlated subquery pattern is not supported yet; 当我使用left join 时。另一方面,当我将代码更改为join 时,它工作得很好。我怀疑这是因为我的子查询中有一个聚合函数和逻辑表达式,使我的左连接成为内连接。

但正如我上面提到的,我需要保留表 question 中的所有值。

下面是我的代码

select
qa.user_id as user_email,
i.timestamp as session_login_time,
qa.timestamp as question_ask_time,
qa.question_id,
qa.question
from 
schema1.question as qa
left join
schema1.user as i
on
    qa.user_id = i.email
and 
    i.timestamp =
        (select
            max(timestamp)
         from schema1.user
         where
            timestamp <= qa.timestamp)
where user_email <> 'tester' and user_email not like '%tester.com'
group by qa.user_id, i.timestamp, qa.timestamp, qa.question_id, qa.question

子查询的目的是获取最接近每个question_ask_timesession_login_time。因此,question 的多行可以具有相同的session_login_time 值。

有人可以帮我找出我上面的代码中缺少的东西吗?如何使我的左连接有效?

非常感谢!

【问题讨论】:

  • 实际上,如果我取出第二个连接条件(包含子查询的那个)并将其放在最后的 where 语句之后,那会起作用吗? - 我现在不能测试它,只是想得到你的意见
  • 如果您想要由每个表中的一行组成的行,其中两列以某种方式相关,那就是joinon。此外,如果您希望某个值是子选择中的任何值之一,那就是in。您可以用 Google 重新替换 join、in、标量子查询和彼此存在。

标签: mysql join left-join amazon-redshift


【解决方案1】:

我想这应该可以在不涉及子查询的情况下为您提供相同的结果

select
    qa.user_id as user_email,
    max(i.timestamp) as session_login_time,
    qa.timestamp as question_ask_time,
    qa.question_id,
    qa.question
from schema1.question as qa
left join schema1.user as i
on qa.user_id = i.email
and i.timestamp  <= qa.timestamp
where qa.user_id <> 'tester' and qa.user_id not like '%tester.com'
group by qa.user_id, qa.timestamp, qa.question_id, qa.question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 2015-06-18
    • 2010-09-18
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多