在 Redshift 的 JOIN 中使用模式名称

Posted

技术标签:

【中文标题】在 Redshift 的 JOIN 中使用模式名称【英文标题】:Use schema name in a JOIN in Redshift 【发布时间】:2018-04-06 00:54:32 【问题描述】:

我们的数据库设置为使我们的每个客户都托管在单独的架构中(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】:

您最好的选择可能是从您调用它的任何来源手动设置交易中的搜索路径。看到这个:

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;

这将尝试匹配第一个可用的客户表,巧合的是,您刚刚将其设置为客户的架构!

如果需要,您可以在之后手动恢复,或者只需将连接重置为默认值,由您决定

【讨论】:

所以不是真的。为了澄清起见,我们的数据库结构是我们为每个客户端都有模式。我正在构建一个查询,该查询将存储为在每个客户端架构上运行的视图,以获取前端的数据。运行此查询时,搜索路径已设置,但代码无法知道搜索路径是什么,因为它已经在存储在该架构上的视图中。我正在尝试获取正在运行视图的架构的名称,但它可以是任何客户端的架构。手动设置搜索路径并不适用。

以上是关于在 Redshift 的 JOIN 中使用模式名称的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Redshift 中使用 % JOIN 进行 LIKE

在 Redshift 上混合使用 CROSS JOIN 和 LEFT JOIN

Redshift:将 FULL OUTER 替换为 CROSS JOIN

Redshift 查看所有模式中的所有表

使用 Redshift 数据库时,SQL Join 或 SUM 返回太多值

Redshift 中的 update + case + join 语句