首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >排除联接中的重复字段

排除联接中的重复字段
EN

Stack Overflow用户
提问于 2013-02-25 15:06:37
回答 1查看 2.7K关注 0票数 7

我有一个正在分析的数据集。事实证明,它可以很容易地通过人口统计和社区数据来丰富,这极大地改善了分析结果。

为了做到这一点,我在做分析之前加入了人口统计和社区数据。我需要从我的核心样本集中排除一些字段,所以我的连接看起来像这样:

代码语言:javascript
运行
复制
select sampledata.c1, 
       sampledata.c2, 
       demographics.*, 
       community.* 
from sample data 
    join demographics using (zip) 
    join community using (fips)

这将使我在输出中获得多个zip或fips列,而我的分析引擎无法处理这些列。我不能手动指定每个字段-富集表最终会产生数百列。

我可以执行select *,但这样我就可以拥有样本数据中我不想要的所有列。

如何在不复制字段的情况下联接丰富数据,同时仍然从示例表中选择所需的列?

我的一个想法是,如果postgres (我的数据库)能够完全限定输出中的每一列(如sample.c1、demographics.c1等),我会非常满意。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-25 16:36:52

SQL中没有列排除语法,只有列包含语法(通过所有列的*运算符,或显式列出列名)。

仅生成所需列的列表

但是,您可以使用架构表和数据库的一些内置函数生成带有数百个列名的SQL语句,去掉您不想要的几个重复列。

代码语言:javascript
运行
复制
SELECT
    'SELECT sampledata.c1, sampledata.c2, ' || ARRAY_TO_STRING(ARRAY(
        SELECT 'demographics' || '.' || column_name
        FROM information_schema.columns
        WHERE table_name = 'demographics' 
        AND column_name NOT IN ('zip')
        UNION ALL
        SELECT 'community' || '.' || column_name
        FROM information_schema.columns
        WHERE table_name = 'community' 
        AND column_name NOT IN ('fips')
    ), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement

这只会打印出语句,而不会执行它。然后你只需复制结果并运行它。

如果您想一次性动态地生成和运行语句,那么您可以阅读有关如何在PostgreSQL documentation中运行动态SQL的信息。

使用表名作为列名的前缀

或者,这会生成一个包含所有列的选择列表,包括那些具有重复数据的列,但随后会为它们添加别名,以包括每列的表名。

代码语言:javascript
运行
复制
SELECT
    'SELECT ' || ARRAY_TO_STRING(ARRAY(
        SELECT table_name || '.' || column_name || ' AS ' || table_name || '_' || column_name
        FROM information_schema.columns
        WHERE table_name in ('sampledata', 'demographics', 'community')
    ), ',') || ' FROM sampledata JOIN demographics USING (zip) JOIN community USING (fips)'
AS statement

同样,这只会生成语句。如果您希望动态生成和运行语句,则需要温习一下数据库的动态SQL执行,否则只需复制并运行结果即可。

如果您确实需要在列别名中使用点分隔符,则必须使用双引号的别名,如SELECT table_name || '.' || column_name || ' AS "' || table_name || '.' || column_name || '"'。但是,双引号别名可能会导致额外的复杂性(区分大小写等);因此,我使用下划线字符来分隔别名中的表名和列名,然后可以将别名视为常规列名。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15061733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档