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 |
+----------+----------+
此结果符合第一篇文章中的结果。两个查询和两个结果之间有什么区别?为什么第二张海报没有看到任何重复?
默认情况下,如果您使用*
,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;
这也消除了重复。但这并不能解释为什么第二张海报没有得到任何重复。 – 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
这肯定会消除重复。但是,由于第二张海报没有使用这种语法,为什么他/她没有看到任何重复? – Schemer 2014-09-01 22:07:00
该问题中的OP说:“当我获取查询结果时” - 我猜测他们在应用程序中获取关联数组,并自然强制同名的列合并成一个数组元素,一个覆盖另一个。 SQL允许结果集具有多个具有相同列名称的列,但关联数组不能。 – 2014-09-02 14:54:41
我只是重新两个表,以包括COL_NAME值“独一无二”的约束,我也得到了相同的结果两者加入和离开加入。你能澄清一下吗? – Schemer 2014-09-01 21:27:26