2014-09-01 377 views
0

關於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

回答

1

默認情況下,如果您使用*,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

1

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

相關問題