SQL: 连接具有大量列的表时删除重复列

SQL: Remove duplicate columns when joining tables with large number of columns

Objective:我希望能够从 2 个表之间的 JOIN 的输出中删除公共/重复列。

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

之后明确提及列名

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

我处理的表通常每个表都有20+列,单独手动写每个列名不是最优的。

因此,如果表 A 有 A 列,表 B 有 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>

如果唯一重复的列是 JOIN 列,您可以使用 USING:

解决此问题
SELECT *
FROM TABLEA A INNER JOIN
     TABLEB B 
     USING (id)
WHERE <SOME_CONDITION>;

如果您不想写下所有列名,那么您需要使用动态 SQL 到 select 来自 table 架构的不同列名,然后执行您的查询字符串.

示例:

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