Looking for sql Keywords? Try Ask4Keywords

SQL フル・ジョイン


あまり知られていないJOINの1つのタイプは、FULL JOINです。
(注:FULL JOINは2016年のMySQLではサポートされていません)

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結合と同じ効果があります。これは、FULL JOINを実行している場合に望ましくないものです。

例:

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)