【问题标题】:SQL: Remove duplicate columns when joining tables with large number of columnsSQL:连接具有大量列的表时删除重复列
【发布时间】:2019-11-28 22:00:02
【问题描述】:

目标:我希望能够从 2 个表之间的 JOIN 的输出中删除常见/重复的列。

问题:我在这里检查过的关于这个主题的大多数其他问题,都谈到在 select

之后明确提及列名

例如:SQL Server : removing duplicate column while joining tables

我正在处理的表通常每个都有 20+ 列,单独手动编写每个列名并不是最佳选择。

因此,如果 TableA 有 A 列,TableB 有 B 列,它们之间有一个公共列,那么来自 JOIN 的非重复列的最终数量将是 A+B-1,其中 A, B > 20

现有查询:

-- Following query includes the duplicate column in the result
SELECT *
FROM TABLEA A
INNER JOIN TABLEB B ON (A.ID = B.ID)
WHERE <SOME_CONDITION>

我遇到的其他解决方案:

-- Following query omits the duplicate column in the result
SELECT A.ID, A.A1, A.A2, A.A3, A.A4, A.A5, A.A6, A.A7, A.A8, A.A9, A.A10,
    B.A1, B.B2, B.B3, B.B4, B.B5, B.B6, B.B7, B.B8, B.B9, B.B10
FROM TABLEA A
INNER JOIN TABLEB B ON (A.ID = B.ID)
WHERE <SOME_CONDITION>

【问题讨论】:

  • 您最好的选择是明确列出列名。您需要动态 SQL 来逐字实现您的想法。
  • 这类问题是糟糕设计的典型表现。
  • @Strawberry:表面上我也有同样的感觉。我与之交谈的数据库架构师说,这些表带有多个列,以避免更多的连接,这反过来会增加实时仪表板的(查询执行 + 数据获取)时间。
  • 我不买

标签: mysql sql vertica


【解决方案1】:

如果唯一重复的列是 JOIN 列,您可以使用 USING 解决此问题:

SELECT *
FROM TABLEA A INNER JOIN
     TABLEB B 
     USING (id)
WHERE <SOME_CONDITION>;

【讨论】:

  • 在这种情况下,常用列的 column_name 必须相同?
  • @Arsenic_33 。 . .为此,JOIN 使用的列名必须相同。
【解决方案2】:

如果您不想写下所有列名,那么您需要使用动态 SQL 从表架构中选择不同的列名,然后执行您的查询字符串。

例子:

SELECT GROUP_CONCAT(DISTINCT(COLUMN_NAME) SEPARATOR ', ')
INTO   @ditinct_columns
FROM   information_schema.columns
WHERE  table_name IN ('A', 'B');

SET @q = CONCAT("SELECT ", @ditinct_columns, " FROM A AS a INNER JOIN B AS b ON <SOME_CONDITION>");

SELECT @q;

/* execute*/
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt

【讨论】:

  • 能够从逻辑上理解这一点。 GROUP_CONCAT 在使用 Vertica 时遇到问题(通过开箱即用的 DBeaver)。例如,我将 information_schema.columns 替换为 v_catalog.columns
猜你喜欢
  • 2017-06-15
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2018-07-15
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多