2016-08-29 7 views
0

表2では、各T_CODE(AB & AC)に対して2つのE_NO(55 & 56)が必要です。1つ2つのリレーションシンク

これらの2つのテーブルを結合して、すべてのT_CODEとE_NOを表示したいとします。表2で使用できない場合には、結果が

T_NO T_Code E_NO 
1   AB 55 
1  **AB** **56** 
1   AC 56 
1  (null) (null) -> AC 55 
2   AB 56 
2  **AB** **55** 
3   AC 55 
3   AC 56 
3   AB 55 
3   AB 56 
4   AC 55 
4  **AC** **56** 

あなたたちは私を助けてくださいNULL

表-1

T_NO T_Code 
1  AB 
1  AC 
2  AB 
3  AB 
3  AC 
4  AC 

表-2

T_NO T_Code E_NO 
1   AB 55 
1   AC 56 
2   AB 55 
3   AC 55 
3   AC 56 
3   AB 55 
3   AB 56 
4   AC 55 

が表示されますクエリ。

テーブル1とテーブル2の間で左外部結合を適用しようとしましたが、これは1対2の関係であるため、テーブル2で使用できないレコードではNULLが来ないためです。

Thanks MattとVercelli。

私が試しているもう1つのことは、欠落したフィールドで(nulls)を埋めることです。私はいくつかのロジックを使用してPL-SQLでそれを試していますが、それを行うための簡単な方法が私の質問です。

+0

表1のT_NO 3&4はすべてnullであるか、結果セットに含まれていないはずですか? – Matt

+1

Table_1とTable_2の関係は何ですか?たとえば、T_NO = 2の場合、Table_1にはT_Code = ABしかありませんが、Table_2にはまだT_NO = 2とT_Code = ACがあります。だから、これはTable_1にどのように関連していますか?次に、Table_2に重複が存在する可能性がありますか?そうであれば、結果で何が起こるはずですか?対応するペアがTable_2にない場合、T_CodeとE_NOにヌルの行を追加するだけですか? – mathguy

+0

とtable1のT_Code = ABの2つの行のみがtable2(ここではt_code = AB)と一致し、t_no = 2とt_code = ACの結果が異なる場合、NULL値を持つ必要がありますか? –

答えて

1

一致するデータが存在しないため、それ

with aux as (select 55 as e_no from dual 
      union all 
      select 56 as e_no from dual) 
select t1.T_NO, t2.T_CODE, t2.E_NO 
    from table1 t1 cross join aux a 
       left join table2 t2 on t1.T_NO = t2.T_NO 
            and t1.T_CODE = t2.T_CODE 
            and a.E_NO = t2.E_NO; 
+0

ユニオンの代わりに(値(55)、(56)) 'aux(e_no)のような値を使用する必要があります。 – Hogan

+0

@Hoganありがとう、私はそれを見てみようユニオンまたはユニオンの代わりに – vercelli

1

はすべてNULLを返す必要があります3 & 4を想定して参加した補助ビュー(aux)とのクロスを使用します。

WITH cteAllPossibleCombinations AS (
    SELECT DISTINCT t.T_NO, c2.T_code, c.E_NO 
    FROM 
     Table1 t 
     CROSS JOIN (SELECT 55 as E_NO from dual UNION SELECT 56 from dual) c 
     CROSS JOIN (SELECT 'AB' as T_code from dual UNION SELECT 'AC' from dual) c2 
) 

SELECT 
    c.T_NO 
    ,t.T_Code 
    ,t.E_NO 
FROM 
    cteAllPossibleCombinations c 
    LEFT JOIN Table2 t 
    ON c.T_NO = t.T_NO 
    AND c.T_code = t.T_Code 
    AND c.E_NO = t.E_NO 

この答えは時に「ABを扱うが、 'または' AC 'も表1から抜けています。

あなたのコメントごとに編集してください。だから私はまだあなたがNULLのあなたの記入を望んでいる明確ではない。それが存在するかどうかを区別したくない場合は、上記の2番目の選択肢をすべて忘れて選択してください。

SELECT 
    c.T_NO 
    ,COALESCE(t.T_Code,'**' + c.T_Code) AS T_Code 
    ,COALESCE(CAST(t.E_NO AS VARCHAR(10)),CAST(c.E_NO AS VARCHAR(10)) + '**') as E_No 
    ,CASE WHEN t.T_Code IS NULL THEN 'NO' ELSE 'yes' END as Matched 
FROM 
    cteAllPossibleCombinations c 
    LEFT JOIN @Table2 t 
    ON c.T_NO = t.T_NO 
    AND c.T_code = t.T_Code 
    AND c.E_NO = t.E_NO 

注両方のコードの後の部分は、CTEが必要です。

SELECT * FROM cteAllPossibleCombinations 

あなたが一致していないいくつかをやったことを区別するために欠けている場合は、どのようにここにあなたがいることを理解するのに役立つかもしれないクエリです。ここで

+0

'CROSS JOIN(VALUES(55)、(56))c CROSS JOIN(VALUES(' AB ')、(' AC '))c2' – Hogan

+0

MattとVercelliに感謝します。 私が試しているもう1つのことは、欠落しているフィールドで(nulls)を埋めることです。私はいくつかのロジックを使用してPL-SQLでそれを試していますが、それを行うための簡単な方法が私の質問です。 –

+0

Table1のすべてのT_Noに対して4行の組み合わせを与えるcteAllPossibleCombinationsから*を選択してください。 – Matt

0

あなたが行く:

SELECT C.E_NO, C.T_CODE, T2.T_NO 
FROM ( 
    SELECT E_NO.E_NO, T_CODE.T_CODE 
    FROM (VALUES (55), (56)) AS E_NO(E_NO), 
     (VALUES ('AB'), ('AC')) AS T_CODE(T_CODE) 
) AS C 
LEFT JOIN Table-2 AS T2 ON (C.E_NO, C.T_CODE) = (T2.E_NO, T2.T_CODE) 

これはあなたに値を持っているもののためT2.T_NOを与えるだろう。見つからないものを挿入する場合は、上記のクエリを使用し、代わりにWHERE T2.T_NO is nullを追加すると、「見つからない」もののリストが表示されます。

関連する問題