Looking for sql Keywords? Try Ask4Keywords

SQL 完全加入


一種鮮為人知的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)