1. 程式人生 > >mysql實現full outer join

mysql實現full outer join

由於mysql設計時不支援full outer join,

所以如果有全連線需求時,需要一點小技巧來實現。

full outer join = left outer join union all right outer join

看如下表結構:

A:

+------+----------+
| id   | username |
+------+----------+
|    1 | wuwh     |
|    2 | meimei   |
+------+----------+

B:

+------+------------+
| id   | objectname |
+------+------------+
|    1 | 電子     |
|    3 | 衣服     |
+------+------------+

C:

+------+--------------+
| id   | detail       |
+------+--------------+
|    1 | 電子詳情 |
|    3 | 衣服詳情 |
|    4 | 車子詳情 |
+------+--------------+

先實現一個小需求:

A full outer join B之後,合併兩列id,並且id不能重複,sql如下:

select distinct aaabbb.aaabbb_id,username,objectname from(

SELECT 

CASE 

WHEN aaa.id IS NOT NULL THEN aaa.id 

WHEN bbb.id IS NOT NULL THEN bbb.id 

END AS aaabbb_id, 

username, objectname

 FROM aaa left join bbb on aaa.id = bbb.id 

union all 

SELECT 

CASE 

WHEN aaa.id IS NOT NULL THEN aaa.id 

WHEN bbb.id IS NOT NULL THEN bbb.id 

END AS aaabbb_id, 

username, objectname 

FROM aaa right join bbb on aaa.id = bbb.id;

)ccc

結果:

+-----------+----------+------------+
| aaabbb_id | username | objectname |
+-----------+----------+------------+
|         1 | wuwh     | 電子     |
|         2 | meimei   | NULL       |
|         3 | NULL     | 衣服     |
+-----------+----------+------------+

接下來是三路full outer join

SELECT DISTINCT com_id
, username
, objectname
, detail
FROM (
SELECT IF(aaabbb.aaabbb_id IS NOT NULL, aaabbb.aaabbb_id, IF(ccc.id IS NOT NULL, ccc.id, '')) AS com_id
, username
, objectname
, detail
FROM (
SELECT CASE 
WHEN aaa.id IS NOT NULL THEN aaa.id
WHEN bbb.id IS NOT NULL THEN bbb.id
END AS aaabbb_id
, username
, objectname
FROM aaa
LEFT OUTER JOIN bbb
ON aaa.id = bbb.id
UNION ALL
SELECT CASE 
WHEN aaa.id IS NOT NULL THEN aaa.id
WHEN bbb.id IS NOT NULL THEN bbb.id
END AS aaabbb_id
, username
, objectname
FROM aaa
RIGHT OUTER JOIN bbb
ON aaa.id = bbb.id
) aaabbb
LEFT OUTER JOIN ccc
ON aaabbb.aaabbb_id = ccc.id
UNION ALL
SELECT IF(aaabbb.aaabbb_id IS NOT NULL, aaabbb.aaabbb_id, IF(ccc.id IS NOT NULL, ccc.id, '')) AS com_id
, username
, objectname
, detail
FROM (
SELECT CASE 
WHEN aaa.id IS NOT NULL THEN aaa.id
WHEN bbb.id IS NOT NULL THEN bbb.id
END AS aaabbb_id
, username
, objectname
FROM aaa
LEFT OUTER JOIN bbb
ON aaa.id = bbb.id
UNION ALL
SELECT CASE 
WHEN aaa.id IS NOT NULL THEN aaa.id
WHEN bbb.id IS NOT NULL THEN bbb.id
END AS aaabbb_id
, username
, objectname
FROM aaa
RIGHT OUTER JOIN bbb
ON aaa.id = bbb.id
) aaabbb
RIGHT OUTER JOIN ccc
ON aaabbb.aaabbb_id = ccc.id
) ddd;

結果:

+--------+----------+------------+--------------+
| com_id | username | objectname | detail       |
+--------+----------+------------+--------------+
| 1      | wuwh     | 電子     | 電子詳情 |
| 3      | NULL     | 衣服     | 衣服詳情 |
| 2      | meimei   | NULL       | NULL         |
| 4      | NULL     | NULL       | 車子詳情 |
+--------+----------+------------+--------------+

相關推薦

mysql實現full outer join

由於mysql設計時不支援full outer join, 所以如果有全連線需求時,需要一點小技巧來實現。 full outer join = left outer join union all right outer join 看如下表結構: A: +------+--

SparkSql中join實現( inner join,left outer join,right outer joinfull outer join

Join是SQL語句中的常用操作,良好的表結構能夠將資料分散在不同的表中,使其符合某種正規化,減少表冗餘、更新容錯等。而建立表和表之間關係的最佳方式就是Join操作。 SparkSQL作為大資料領域的SQL實現,自然也對Join操作做了不少優化,今天主要看一下在SparkS

Mysql實現full join的替換方法

目前mysql還不支援full join,只能使用left join、union、right join來實現。但使用這個方法解決多次full join的話程式碼量非常龐大,一直在思考有沒有其他替代方法。 今天解決一個問題的時候突然想到了一個替代方法:使用行列轉換。 這個方法

Linq表連接大全(INNER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOINFULL OUTER JOIN、CROSS JOIN)

iar value fsm wdcp esc max als tla plc 轉載http://www.cnblogs.com/shenqiboy/p/3260105.html 我們知道在SQL中一共有五種JOIN操作:INNER JOIN、LEFT OUTER JOIN、

SQL的JOIN語法解析(inner join, left join, right join, full outer join的區別)

問題 至少 caption 左連接 右連接 class hole pty lock 總的來說,四種JOIN的使用/區別可以描述為: left join 會從左表(shop)那裏返回所有的記錄,即使在右表(sale_detail)中沒有匹配的行。 right oute

Oracle外連線(left/right/full outer join)語法詳解

相比常用的精確查詢(內連線,inner join),外連線相比不好理解。但在實際工作中,用的還是很多的,深刻理解外連線成為必須。 看到一篇帖子,清晰易懂,轉發一下。 內容: -------------------------------------------------

hive 各種 join (left outer joinjoinfull outer join

一、概念 1、左連線 left outer join 以左邊表為準,逐條去右邊表找相同欄位,如果有多條會依次列出 2、連線join 找出左右相同同的記錄 3、全連線 full outer  join 包括兩個表的join結果,左邊在右邊中沒找到的結果(NULL),右邊在左邊

ORACLE11G優化器對full Outer join 的加強

1 降級優化器到10.2SQL> alter system set optimizer_features_enable ='10.2.0.2' scope=memory ; System altered. 2 執行全外連線語句 SQL> se

left join 和 left outer join 的區別 ,full outer join

 通俗的講:    A   leftjoin   B   的連線的記錄數與A表的記錄數同    A   rightjoin   B   的連線的記錄數與B表的記錄數同      A   leftjoin   B   等價B   rightjoin   A          

OCP-1Z0-051 第126題 LEFT OUTER JOIN,FULL OUTER JOIN,JOIN的使用

View the Exhibit and examine the data in the PROJ_TASK_DETAILS table. The PROJ_TASK_DETAILS table stores information about tasks involved in a project and

FULL OUTER JOIN關聯多個子查詢結果值去重

         以日期GROUP  BY分組查詢並作為條件關聯3個子查詢,子查詢分別對應T1/T2/T3,日期是唯一關聯條件,一環扣一環,但是如果其中某一天T1、T3有結果值,但是T2是個空集,鏈條就斷了,就會同一天出現兩條資料即重複日期的結果。這時只要在查詢結果外面再加一

mysqlfull join實現

資料庫多表查詢主要有以下幾種 inner join內連線查詢,只有兩個表都匹配才會顯示記錄 left /right [outer] join 左/右外連線  左表匹配右表,左表全部顯示,結果中缺少的右表字段的值 則返回null,右外連線相反 full join 全連線,只要

mysql 裡怎麼實現full join

mysql現在還不支援full join ,那如果有這種需求怎麼辦呢?可以用union all來實現 資料來源如下 CREATE TABLE L AS SELECT 'left_1' AS str,'1' AS v FROM dual UNION ALL SELECT 'l

MySQL中使用INNER JOIN實現Intersect並集操作

int isam har 業務 charset tin ner get 一句話 MySQL中使用INNER JOIN來實現Intersect並集操作 一、業務背景 我們有張表設計例如以下: CREATE TABLE `user_defined_value` (

12.MySQL優化Outer Join Simplification講解

介紹 在許多情況下,簡化了查詢的FROM子句中的表的表示式。 在解析器階段,具有右外連線操作的查詢將轉換為僅包含左連線操作的等效查詢。 在一般情況下,轉換是這樣執行的: (T1, ...) RIGHT JOIN (T2, ...) ON P(T1, ..., T2, ...)

11.MySQL優化Outer Join Optimization

介紹 Outer joins包含LEFT JOIN和RIGHT JOIN. MySQL實現了一個A LEFT JOIN B join_condition,如下所示: 表B設定為依賴於表A和A所依賴的所有表。 表A設定為依賴於LEFT JOIN條件中使用的所有表(B除

Basic Join 基本交,Cross Join 叉交,INNER JOIN 內交,OUTER JOIN 外交,Left join 左交,Right join 右交,Full join全交都是什麼?

Basic Join Operation--comma-separated join(叉乘,都乘到N*M,N,M分別是兩個表的條數) 馬克-to-win:  select * from register, student; Cross Join(叉乘,都乘到N*M,N,M分

mysql中left join,right join,inner join,outer join的用法詳解【轉】

非常慚愧用了這麼久的mysql居然沒有用過outer join和inner join,對outer join的認識也僅是知道它是外連結,至於什麼用途都不清楚,至於還有沒有left outer join更是不得而知,某天有人問起,才想起自己mysql知識的貧乏,趕緊找了一下網上

Oracle 內連線(inner join)、外連線(outer join)、全連線(full join

http://blog.itpub.net/30175262/viewspace-1472290/之前沒有用過 full outer join,第一次用,學習一下Student表Color表Oracle中的連線可分為,內連線(inner join)、外連線(outer joi

MySQL 有幾種Join,其底層實現原理是什麼?

mysql只支援一種join演算法:Nested-Loop Join(巢狀迴圈連線),但Nest