在连接共享某些列名的两个表时,是不是有一种动态方法可以为一个表的所有列名添加前缀?

Posted

技术标签:

【中文标题】在连接共享某些列名的两个表时,是不是有一种动态方法可以为一个表的所有列名添加前缀?【英文标题】:Is there a dynamic way to add a prefix to all column names of one table when joining two tables who share some column names?在连接共享某些列名的两个表时,是否有一种动态方法可以为一个表的所有列名添加前缀? 【发布时间】:2020-11-10 00:47:02 【问题描述】:

下面是两个非常小的示例表来解释这种情况。

表 a 有列(时间长度高度

表 b 有列(timelengthwidth

当我执行左连接时,我将拥有 Table c 列(timelengthheight , 时间, 长度, 宽度)

是否有一种动态方法可以为 Table a 中的所有列名添加前缀以使列明确?

我希望 表格 c 显示为 (table_a_time, table_a_length, table_a_height, 时间长度宽度)。

【问题讨论】:

Redshift 不支持任何此类功能。该接口是一个简单的 SQL。正如@CoffeeNeedCoffee 解释的那样,要实现您想要的需要一些查询生成。我推荐的是dbt——它是一个开源python项目,它为你的sql脚本提供了jinja模板和模型依赖。在那里你可以添加一个宏来为列添加前缀(这就是我们所做的)。 【参考方案1】:

我能想到的唯一方法是将 SELECT 语句动态构建成一个字符串,以便以后执行。


DECLARE @fullQuery varchar(max) = ''
SELECT  @fullQuery = 
    'SELECT '  + 
        stuff( /* grab every column from Table A and give it an alias with a prefix */
            (
                select ', table_a.' + column_name + ' as table_a_' + column_name 
                from INFORMATION_SCHEMA.columns 
                where table_name = 'YOUR_TABLE_NAME_HERE'
                FOR XML PATH (''), TYPE
            ).value('.', 'varchar(max)')
        , 1, 2, '') 
    + ', table_b.*
    FROM YOUR_TABLE_NAME_HERE table_a 
    LEFT JOIN YOUR_TABLE_NAME_HERE table_b on table_a.pk = table_b.pk' 

-- SELECT @fullQuery -- debug

EXEC(@fullQuery)

这将获取表 A 中的所有列,生成重命名每一列的基本 SELECT 语句,然后还显示表 B 中的每一列。如果您确实想要两个表中的每一列,则效果最佳,但您可以缩小范围如果您事先知道各个列。

【讨论】:

以上是关于在连接共享某些列名的两个表时,是不是有一种动态方法可以为一个表的所有列名添加前缀?的主要内容,如果未能解决你的问题,请参考以下文章

power query展开表时动态获取要展开的列

从 PHP 中检索 MYSQL 连接值

XCode 中是不是有一种好方法可以跨项目重用类并轻松与其他开发人员共享?

SQL 填充常量以防万一连接两个表时不匹配

如何解决sqlserver2005中用多表连接的结果建一张新表时,提示各表中的列名必须唯一的问题?

在连接两个表时获得R中的加权平均值