MySQL:在连接中具有相同名称的重复列

问题描述:

关于SO的两个问题似乎在询问关于等价MySQL查询的不同行为。在这两种情况下,正在对具有相同列名称的表执行联接。 This poster询问如何从结果中删除具有相同名称的重复列,并且this poster询问如何实现结果中具有相同名称的列的重复。MySQL:在连接中具有相同名称的重复列

为了测试这一点,我创建玩具表:

mysql> describe table_1; 
+----------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+----------+--------------+------+-----+---------+-------+ 
| col_name | varchar(255) | YES |  | NULL |  | 
+----------+--------------+------+-----+---------+-------+ 

mysql> describe table_2; 
+----------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+----------+--------------+------+-----+---------+-------+ 
| col_name | varchar(255) | YES |  | NULL |  | 
+----------+--------------+------+-----+---------+-------+ 

我插入值“value”到这两个表和并执行这些连接,其中JOIN_OP是任一“加入”或“左连接”:

mysql> select * from table_1 as t1 JOIN_OP table_2 as t2 on t1.col_name = t2.col_name; 
+----------+----------+ 
| col_name | col_name | 
+----------+----------+ 
| value | value | 
+----------+----------+ 

此结果符合第一篇文章中的结果。两个查询和两个结果之间有什么区别?为什么第二张海报没有看到任何重复?

+0

我只是重新两个表,以包括COL_NAME值“独一无二”的约束,我也得到了相同的结果两者加入和离开加入。你能澄清一下吗? – Schemer 2014-09-01 21:27:26

默认情况下,如果您使用*,MySQL将返回所有表的所有列。返回两列,分别是table_1和table_2。您需要在查询中明确输入列名以按照您的方式检索它们。使用查询,如下所示:

select t1.col_name from table_1 as t1 JOIN_OP table_2 as t2 on t1.col_name = t2.col_name; 
+0

这也消除了重复。但这并不能解释为什么第二张海报没有得到任何重复。 – Schemer 2014-09-01 22:08:31

SQL:2003条规则说,如果你使用USING()连接条件,冗余列从选择列表中排除,因为它是完全清楚的列具有相同的名称和相同的价值。

mysql> select * from table_1 as t1 JOIN table_2 as t2 USING (col_name); 
+----------+ 
| col_name | 
+----------+ 
| value | 
+----------+ 

而如果你使用了更详细JOIN ON语法,并使用select *,选择列表中保留每个连接表的一个单独的列,即使在这种情况下,我们可以告诉大家,值绑定相同。

但是,显然SQL不够聪明,无法进行推断,因为ON子句中的条件可能不是平等的,例如,它可能是ON t1.col_name <> t2.col_name,因此两列应保留在选择列表中,因为它们会有不同的值。

MySQL 5.0.12和更高版本支持这种标准行为(为了更符合标准,在MySQL 5.0.12中加入了一些语义修复)。

你可以看到更多的讨论在这里:http://bugs.mysql.com/bug.php?id=6489

+0

这肯定会消除重复。但是,由于第二张海报没有使用这种语法,为什么他/她没有看到任何重复? – Schemer 2014-09-01 22:07:00

+2

该问题中的OP说:“当我获取查询结果时” - 我猜测他们在应用程序中获取关联数组,并自然强制同名的列合并成一个数组元素,一个覆盖另一个。 SQL允许结果集具有多个具有相同列名称的列,但关联数组不能。 – 2014-09-02 14:54:41