Amazon Redshift 错误 - 错误:0A000:Redshift 表不支持指定的类型或函数(每条 INFO 消息一个)

Mat*_*att 2 sql amazon-redshift aginity

运行以下查询时:

WITH sublevels AS (
SELECT 1 UNION ALL 
SELECT 1 UNION ALL
SELECT 1), FIELDA AS (SELECT (ROW_NUMBER() OVER ())::INT sublevel 
FROM sublevels sl1, sublevels sl2, sublevels sl3)
SELECT TOP 10 
FIELDB, 
sublevel, REPLACE(REGEXP_REPLACE(REGEXP_SUBSTR(UPPER(FIELDC), 'FROM \\S+', 1, sublevel), 'FROM ', ''),')','') ALIASA
FROM TABLEA
JOIN FIELDA ON sublevel <= REGEXP_COUNT(UPPER(FIELDC), 'FROM ')
WHERE ALIASA != 'ABC'
AND lower(split_part(ALIASA, '.', 2)) IN (
SELECT DISTINCT lower(t.table_name)
FROM information_schema.tables t
INNER JOIN information_schema.columns c on c.table_name = t.table_name AND c.table_schema = t.table_schema
WHERE lower(column_name) similar TO '%(aaa|bbb|ccc)%')
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:0A000:Redshift 表不支持指定的类型或函数(每个 INFO 消息一个)。

我不知道为什么,如果我单独运行查询,它们工作正常:

查询1

WITH sublevels AS (
SELECT 1 UNION ALL 
SELECT 1 UNION ALL
SELECT 1), FIELDA AS (SELECT (ROW_NUMBER() OVER ())::INT sublevel 
FROM sublevels sl1, sublevels sl2, sublevels sl3)
SELECT TOP 10 
FIELDB, 
sublevel, REPLACE(REGEXP_REPLACE(REGEXP_SUBSTR(UPPER(FIELDC), 'FROM \\S+', 1, sublevel), 'FROM ', ''),')','') ALIASA
FROM TABLEA
JOIN FIELDA ON sublevel <= REGEXP_COUNT(UPPER(FIELDC), 'FROM ')
WHERE ALIASA != 'ABC'
Run Code Online (Sandbox Code Playgroud)

查询2

SELECT DISTINCT lower(t.table_name)
FROM information_schema.tables t
INNER JOIN information_schema.columns c on c.table_name = t.table_name AND c.table_schema = t.table_schema
WHERE lower(column_name) similar TO '%(aaa|bbb|ccc)%'
Run Code Online (Sandbox Code Playgroud)

Bri*_*rsi 7

我发现的“仅领导节点”错误的唯一解决方法是将选择包装在循环中,如下所示。这对性能来说很糟糕,但在处理小型模式相关表(例如 information_schema、pg_views 等中的对象)时可以接受。

create or replace procedure jupiter.tmp_proc()
as
$$
declare
  row record;
begin
drop table if exists tmp_ViewDef;
create table tmp_ViewDef(schemaname varchar,viewname varchar, schema_view varchar, "DDL" varchar(max));
for row in 
      select 
           cast(schemaname as varchar) as "schemaname"
          ,cast(viewname as varchar) as "viewname"
          ,cast(schemaname as varchar) || '.' || cast(viewname as varchar) as "schema_view"             
          ,cast(definition as varchar(max)) as "DDL"
      from pg_views
  loop
  insert into tmp_viewdef(schemaname,viewname,schema_view,ddl) values (row.schemaname,row.viewname,row.schema_view,row.ddl);
end loop
;
end;
$$ 
language plpgsql
;
call jupiter.tmp_proc()
;
select top 100 * from tmp_ViewDef;
Run Code Online (Sandbox Code Playgroud)


Jon*_*ott 5

在红移中:

  1. 针对 information_schema 的查询仅在领导节点上运行
  2. 对任何“普通”表的查询仅在计算节点上运行

您不能混合搭配 1. 和 2。