Union All 使用注意事項和字段順序不一致導致的異常


使用注意,先說結果:

UNION 操作符用於合並兩個或多個 SELECT 語句的結果集,這里需要注意的是:

  • UNION 內部的 SELECT 語句必須擁有相同數量的列;
  • 列也必須擁有相似的數據類型(實際非必須);
  • 同時,每條 SELECT 語句中列的順序必須相同。

一、表結構數據准備如下:

1.1 test_union_1

結構:

CREATE TABLE `test_union_1` (
  `one` varchar(255) DEFAULT NULL,
  `two` varchar(255) DEFAULT NULL,
  `three` varchar(255) DEFAULT NULL,
  `four` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

數據:

1.2 test_union_2

結構:

CREATE TABLE `test_union_2` (
  `four` varchar(255) DEFAULT NULL,
  `three` varchar(255) DEFAULT NULL,
  `two` varchar(255) DEFAULT NULL,
  `one` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

數據:

兩表數據一致,字段一致,只是字段順序不同。
test_union_1的順序:one,two,three,four
test_union_2 的順序:four,three,two,one

二、驗證

2.1、驗證:UNION 內部的 SELECT 語句必須擁有相同數量的列;

1562053211947

2.2、驗證:列也必須擁有相似的數據類型(實際非必須);

這個實際非必須。

修改表test_union_2 結構如下:String類型改為int類型。

CREATE TABLE `test_union_2` (
 `four` int(255) DEFAULT NULL,
 `three` int(255) DEFAULT NULL,
 `two` int(255) DEFAULT NULL,
 `one` int(255) DEFAULT NULL
) ENGINE = InnoDB CHARSET = latin1;

查詢:

SELECT *
FROM (
 SELECT one, two, three, four
 FROM test_union_1
 UNION ALL
 SELECT one, two, three, four
 FROM test_union_2
) T;

結果:

所以,實際不是字段類型必須一致,只要可以轉換即可。具體轉換邏輯暫時不清楚,后續遇到了再搞。

2.3、驗證:每條 SELECT 語句中列的順序必須相同(親身踩坑)。

先來說下,如果順序不同,會是什么結果?
答:結果字段的順序以 union all 前面的表字段順序為准。
union all 后面的表的數據會按照順序依次附在后面。注意:按照字段順序匹配,而不是按照字段名稱匹配。

測試如下:表順序對結果的影響

2.1 test_union_1 UNION ALL test_union_2

SELECT *
FROM (
 SELECT *
 FROM test_union_1
 UNION ALL
 SELECT *
 FROM test_union_2
) T;

結果:

可發現:結果字段是test_union_1的字段順序:one,two,three,four

2.2 test_union_2 UNION ALL test_union_1

SELECT *
FROM (
 SELECT *
 FROM test_union_2
 UNION ALL
 SELECT *
 FROM test_union_1
) T;

結果:

可發現:結果字段是test_union_2的字段順序:four,three,two,one

綜上:union all結果字段的順序以 union all 前面的表字段順序為准。union all 后面的表的數據會按照字段順序依次附在后面,而不是按照字段名稱匹配。

我們上面以*來表示順序的不同,其實你寫成不同順序的字段結果一致。我親測如此,但是不重復貼結果了。

另外,如果系統中進行了分表,一定要保證各個表的字段順序一致。特別是修改的時候。否則,如果使用 *匯總查詢結果,肯定是會有問題的...親身踩坑。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM