唯一标识连接后两个不同表的相同列名 - mysql


Uniquely identify same column name of two different table after join - mysql

我有2个表。 假设ab

aidnamerollbidgroupname

name列数据不同。如何选择并唯一标识它们?

我知道

SELECT a.id,a.name,a.group FROM a,b ............

我知道这一点。但这是一个例子。我正在处理大量数据,每个表中有 20-30 列。所以我不想写我需要选择的列名,而是想写我想排除的名称。喜欢

SELECT * Except b.name............

或者有什么方法可以在加入后唯一标识。喜欢

.......... a,b WHERE a.name as name1

请不要问为什么这些列名相同。我承认这是一个错误。但它已经实现并大量使用。所以找到另一种方式。有没有简单的方法可以在合并列时排除列?

好吧,你不能写你想排除的名字。 这不是SQL的工作方式。

但是,如果写出 20-30 列名是一个很大的负担,您可以使用 information_schema.columns . 我这样写,因为 20-30 列名不是特别大,把它们写出来可能比写问题省力。

但是,回到解决方案。 它看起来像这样:

select concat(c.column_name, ' as ', 'a_', column_name, ', ')
from information_schema.columns c
where table_name = 'a' ;

您可能还希望包含表架构。

作为一个想法,你可以做的是,如果你想避免特定表的列并且你的语句有多个表,你可以尝试以下,

假设你在表a中有20列,表b中有5列,你想避免表b的

col2,col3和col4.标准方法是你应该写表a的所有列的名称和表b的必填列。但是你可以避免写20列的表的长列表,写a.*,然后键入表b的必需列。请参阅下面的声明。

Select a.*,b.col1,b.col4,b.col5 from a,b

但是,如果您需要从两个表中排除某些列,那么我认为除了从两个表中写入所有必需的列名之外,没有其他方法。

无法

排除 SQL SELECT 语句中的列,只能选择列。您可以在选择列时为其指定别名,如下所示,以便可以使用这些别名标识列。

SELECT a.id as [column1],a.name as [column2],a.group as [column3] FROM a,b ............

无法排除特定列,但您可以避免写入所有列名称并通过以下步骤简化您的工作-

步骤1:执行以下查询-

SELECT a.*,b.* FROM a,b ............limit 1;

步骤2:将其导出为带有标题的csv格式。

步骤3:从csv复制第一行(标题)。

步骤4:删除这些列,这些列不是必需的,并在查询中使用其他列。

只能看到一个waY-

首先创建一个目录表

CREATE TEMPORARY TABLE IF NOT EXISTS mytable
(id int(11) NOT NULL, PRIMARY KEY (id)) ENGINE=MyISAM;

然后将您的列放在临时表中-

SELECT * INTO mytable
FROM YourTable
/* Drop the cloumns that are not needed */
ALTER TABLE mytable
DROP COLUMN ColumnToDrop
/* Get results and drop temp table */
SELECT * FROM #TempTable
DROP TABLE #TempTable