在Redshift中的JOIN中使用模式名称

时间:2018-04-06 00:54:33

标签: sql amazon-redshift

我们的数据库已设置好,以便我们的每个客户端都托管在一个单独的模式中(Postgres / Redshift中的表上方的组织级别,而不是数据库结构定义)。我们在公共模式中有一个表,其中包含有关客户端的元数据。我想在我正在创建的视图中使用一些元数据。

说我有2张桌子:

public.clients

  • name_of_schema_for_client
  • metadata_of_client

client_name.usage_info

  • 无论哪个列都不重要

我基本上想要获取客户端的元数据我正在运行我的查询并在以后使用它:

SELECT * 
FROM client_name.usage_info
INNER JOIN public.clients 
ON CURRENT_SCHEMA() = public.clients.name_of_schema_for_client

这是不可能的,因为CURRENT_SCHEMA()是一个领导节点功能。如果此函数引用用户创建的表,STL或STV系统表或SVV或SVL系统视图,则会返回错误。 (见https://docs.aws.amazon.com/redshift/latest/dg/r_CURRENT_SCHEMA.html

还有其他办法吗?或者我只是在咆哮错误的树?

1 个答案:

答案 0 :(得分:0)

您最好的选择可能是从您调用此源的任何来源手动设置事务中的搜索路径。见:

https://docs.aws.amazon.com/redshift/latest/dg/r_search_path.html

让我们假设你只想使用与你最好的客户匹配的表格:

set search_path to your_best_clients_schema, whatever_other_schemas_you_need_for_this;

然后你可以这样做:

select * from clients;

哪个会尝试匹配第一个可用的客户表,巧合的是,您只需设置为客户端的架构!

如果需要,您可以随后手动还原,或者只是重置连接以返回默认值,由您决定