SQL 完全加入
示例
一种鲜为人知的JOIN类型是FULLJOIN。
(注意:根据2016,MySQL不支持FULLJOIN)
FULLOUTERJOIN返回左侧表的所有行,以及右侧表的所有行。
如果左表中的行在右表中不匹配,或者右表中的行在左表中不匹配,那么这些行也将被列出。
范例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
ONtYear.Year= T_Budget.Year请注意,如果您使用软删除,则必须在WHERE子句中再次检查软删除状态(因为FULLJOIN的行为类似于UNION);
忽略这个小事实很容易,因为您在join子句中放置了AP_SoftDeleteStatus=1。
另外,如果您要执行FULLJOIN,通常必须在WHERE子句中允许NULL;忘记在值上允许NULL将具有与INNER联接相同的效果,如果您正在执行FULLJOIN,则这是您不想要的。
例:
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)