“频谱嵌套查询错误” Redshift 错误

Posted

技术标签:

【中文标题】“频谱嵌套查询错误” Redshift 错误【英文标题】:"Spectrum nested query error" Redshift error 【发布时间】:2020-08-26 05:43:22 【问题描述】:

当我在 Redshift 中运行此查询时:

select sd.device_id
from devices.s_devices sd
left join devices.c_devices cd
on sd.device_id = cd.device_id

我收到这样的错误:

ERROR:  Spectrum nested query error
DETAIL:  
  -----------------------------------------------
  error:  Spectrum nested query error
  code:      8001
  context:   A subquery that refers to a nested table cannot refer to any other table.
  query:     0
  location:  nested_query_rewriter.cpp:726
  process:   padbmaster [pid=6361]
  -----------------------------------------------

我不太清楚这个错误是什么意思。我只加入了一个表,我不确定它指的是哪个“其他表”,而且我在网络上找不到有关此错误的太多信息。

我注意到如果我将其从 left join 更改为 join,错误就会消失,但我确实需要进行左连接。

任何想法我做错了什么?

【问题讨论】:

【参考方案1】:

Redshift reference 提及:

如果子查询中的 FROM 子句引用嵌套表,则它不能引用任何其他表。

在您的示例中,您尝试在一个语句中连接两个嵌套列。

我会先尝试unnest它们,然后才加入:

with 
    s_dev as (select sd.device_id from devices.s_devices sd),
    c_dev as (select cd.device_id from devices.c_devices cd)
select 
    c_dev.device_id
from c_dev 
    left join s_dev 
        on s_dev.device_id = c_dev.device_id

 

【讨论】:

我仍然遇到同样的错误。顺便说一句,这些表确实包含嵌套列,但我加入的 device_id 列都是 varchars。 奇怪 - 我刚刚在一个有 2 个数组列的表上运行了与你类似的查询,我 LEFT JOINed 他们的元素并没有看到任何错误。【参考方案2】:

对我有用的解决方案是使用嵌套表的数据创建一个临时表,然后将临时表与我需要的其余表连接起来。

例如,如果嵌套表是spectrum.customers,则解决方案是:

 DROP TABLE IF EXISTS temp_spectrum_customers;

 CREATE TEMPORARY TABLE
     temp_spectrum_customers AS
 SELECT c.id, o.shipdate, c.customer_id
 FROM spectrum.customers c,
      c.orders o;

 SELECT tc.id, tc.shipdate, tc.customer_id, d.delivery_carrier
 FROM temp_spectrum_customers tc
          LEFT OUTER JOIN orders_delivery d on tc.id = d.order_id;

【讨论】:

以上是关于“频谱嵌套查询错误” Redshift 错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS Quicksight,Redshift“引用嵌套表的子查询不能包含 WINDOW 操作”

如何忽略错误但不跳过 redshift 复制命令中的行

在 Redshift 中取消嵌套 json 会导致查询计划中出现嵌套循环

如何在redshift上取消嵌套json字符串数组[重复]

Redshift 中的嵌套 While 循环

AWS Redshift 中嵌套游标的替代方案