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 join,full 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 JOIN、FULL 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 join、join、full 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是個空集,鏈條就斷了,就會同一天出現兩條資料即重複日期的結果。這時只要在查詢結果外面再加一
mysql的full 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