完全加入
一種鮮為人知的 JOIN 型別是 FULL JOIN。
(注意:根據 2016 年,MySQL 不支援 FULL JOIN)
FULL OUTER JOIN 返回左表中的所有行,以及右表中的所有行。
如果左表中的行沒有右表中的匹配項,或者右表中的行沒有左表中的匹配項,那麼也將列出這些行。
例 1:
SELECT * FROM Table1
FULL JOIN Table2
ON 1 = 2
例 2:
SELECT
COALESCE(T_Budget.Year, tYear.Year) AS RPT_BudgetInYear
,COALESCE(T_Budget.Value, 0.0) AS RPT_Value
FROM T_Budget
FULL JOIN tfu_RPT_All_CreateYearInterval(@budget_year_from, @budget_year_to) AS tYear
ON tYear.Year = T_Budget.Year
請注意,如果你正在使用軟刪除,則必須在 WHERE 子句中再次檢查軟刪除狀態(因為 FULL JOIN 的行為類似於 UNION);
很容易忽略這個小事實,因為你把 AP_SoftDeleteStatus = 1 放在 join 子句中。
此外,如果你正在進行 FULL JOIN,則通常必須在 WHERE 子句中允許 NULL; 忘記在值上允許 NULL 將具有與 INNER 連線相同的效果,如果你正在進行完全連線,這是你不想要的。
例:
SELECT
T_AccountPlan.AP_UID
,T_AccountPlan.AP_Code
,T_AccountPlan.AP_Lang_EN
,T_BudgetPositions.BUP_Budget
,T_BudgetPositions.BUP_UID
,T_BudgetPositions.BUP_Jahr
FROM T_BudgetPositions
FULL JOIN T_AccountPlan
ON T_AccountPlan.AP_UID = T_BudgetPositions.BUP_AP_UID
AND T_AccountPlan.AP_SoftDeleteStatus = 1
WHERE (1=1)
AND (T_BudgetPositions.BUP_SoftDeleteStatus = 1 OR T_BudgetPositions.BUP_SoftDeleteStatus IS NULL)
AND (T_AccountPlan.AP_SoftDeleteStatus = 1 OR T_AccountPlan.AP_SoftDeleteStatus IS NULL)