[英]How to merge more than two (3) tables in SQL
在類似Facebook的通知系統中,我有三個表,就像這樣。
table1
________________________________
| id | value_1 | timestamp |
|----|-----------|-------------|
| id | value21 | 2014-05-21 |
| id | value22 | 2014-05-22 |
|____|___________|_____________|
table2
________________________________
| id | value_2 | timestamp |
|----|-----------|-------------|
| id | value30 | 2014-05-30 |
|____|___________|_____________|
table3
________________________________
| id | value_3 | timestamp |
|----|-----------|-------------|
| id | value01 | 2014-05-01 |
| id | value27 | 2014-05-27 |
|____|___________|_____________|
為了將所有這些數據返回一行,我使用了SQL聯合...
(SELECT value_1 FROM table1)
UNION
(SELECT value_2 FROM table2)
UNION
(SELECT value_3 FROM table3)
...但是它將所有內容匯總到一欄中。 取而代之的是,我需要將結果按時間戳記放在這樣的表中
________________________________________________________
| id | value_1 | value_2 | value_3 | timestamp |
|----|-----------|-----------|-----------|-------------|
| id | null | null | value01 | 2014-05-01 |
| id | value21 | null | null | 2014-05-21 |
| id | value22 | null | null | 2014-05-22 |
| id | null | null | value27 | 2014-05-27 |
| id | null | value30 | null | 2014-05-30 |
|____|___________|___________|___________|_____________|
是否可以僅使用SQL而不將工作移交給PHP引擎? 任何想法表示贊賞。
您可以使用union all
並按以下order by
:
SELECT id, value_1, NULL as value_2, NULL as value_3, timestamp
FROM table1
UNION ALL
SELECT id, NULL, value_2, NULL, timestamp
FROM table2
UNION ALL
SELECT id, NULL, NULL, value_3, timestamp
FROM table3
ORDER BY timestamp;
請注意, union all
比union
效率更高,因為它不返回重復項。
您需要在聯合的每個部分中添加虛擬列:
SELECT value_1
, cast(null as <type_of_value2>) as value_2
, cast(null as <type_of_value3>) as value_3
, ts
FROM table1
UNION
SELECT cast(null as <type_of_value1>) as value_1
, value_2
, cast(null as <type_of_value3>) as value_3
, ts
FROM table2
UNION
SELECT cast(null as <type_of_value1>) as value_1
, cast(null as <type_of_value2>) as value_2
, value_3
, ts
FROM table3
ORDER BY ts
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.