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

Mysql SQL:在连接具有大量列的表时删除重复列,mysql,sql,vertica,Mysql,Sql,Vertica,目标:我希望能够从两个表之间的联接的输出中删除公共/重复列 问题:我在这里检查的关于这个主题的大多数其他问题,都是关于在select之后显式地提到列名 例如: 我正在处理的表通常每个都有20多列,单独手动编写每个列名不是最佳选择 因此,如果TableA有A列,TableB有B列,它们之间有一个公共列,那么连接的非辅助列的最终数量将是A+B-1,其中A,B>20 现有查询: -- Following query includes the duplicate column in the result

目标:我希望能够从两个表之间的联接的输出中删除公共/重复列

问题:我在这里检查的关于这个主题的大多数其他问题,都是关于在select之后显式地提到列名

例如:

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

因此,如果TableA有A列,TableB有B列,它们之间有一个公共列,那么连接的非辅助列的最终数量将是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从表架构中选择不同的列名,然后执行查询字符串

例如:

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

您最好的选择是明确列出列名。您需要动态SQL来逐字实现您的想法。这种问题是设计拙劣的严重症状。@草莓:我也有同样的初步感受。与我交谈过的DB架构师说,这些表包含多个列,以避免更多的联接,这反过来会增加实时仪表板的查询执行和数据获取时间。我不相信能够从逻辑上理解这一点。CONCAT集团通过DBeaver开箱即用解决Vertica问题。例如,我用v_catalog.column替换了information_schema.columns。在本例中,常用列的列名称必须相同?@assens_33。要使其工作,用于联接的列名必须相同。
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