0

クエリには4つのテーブルがあります
テーブルaにはa_id 、a_nameが含まれます
テーブルa_tlにはa_tl_id、a_id、language_id、a_disp_name
が含まれますテーブルbにはb_id 、a_id、b_name
が含まれますテーブルb_tlにはb_tl_id、b_id、language_id、b_disp_name が含まれます

aとa_tlで左外部結合、bとb_tlで左外部結合
、結果のテーブルで内部結合を実行したい。次のクエリを作成しました。

SELECT    case  a.a_disp_name
                WHEN   null  THEN  a.a_name
                else         a.a_disp_name
          end   AS           a_name             ,
          case  b.b_disp_name
                WHEN   null  THEN  b.b_name
                else         b.b_disp_name
          end   AS           b_name             ,
          a_id                                  ,
          b_id                                  
FROM      a                                     ,
          a_tl                                  ,
          b                                     ,
          b_tl                 
WHERE     a.a_id = a_tl.a_id (+)
AND       b.b_id = b_tl.b_id (+)
AND       a_tl.language_id = 2    
AND       b_tl.language_id = 2     
AND       a.a_id= b.b_id

このクエリは、language_idがデータベースに存在する場合に機能します。特定の値が存在しない場合、それは機能しません。つまり、左外部結合が機能しません。

4

2 に答える 2

3

問題は、小切手に使用(+)していないことのようです。 あなたのテーブルは外部結合されているので、レコードが見つからないときもそうですが、それからあなたはチェックします、しかし?です。language_id
language_idNULLlanguage_id = 2language_idNULL

a_tlまた、またはの結果をどこで使用しているのかもわかりません。b_tlこれは、元のクエリではなく、投稿の問題にすぎないと思いますか?


ただし、古い構文の代わりに明示的な結合を使用してください。慣れれば、読みやすく、理解しやすくなります。
クエリは、次を使用することでメリットが得られる場合もありますCOALESCE(または必要NVLに応じて)。

SELECT COALESCE( a_tl.a_disp_name, a.a_name ) AS a_name,
       COALESCE( b_tl.b_disp_name, b.b_name ) AS b_name,
       a.a_id,
       b.b_id
FROM a
JOIN b ON ( b.b_id = a.a_id )
LEFT JOIN a_tl ON ( a_tl.a_id = a.a_id AND a_tl.language_id = 2 )
LEFT JOIN b_tl ON ( b_tl.b_id = b.b_id AND b_tl.language_id = 2 )

私があなたの質問を正しく理解したことを願っています、それがうまくいかないかどうか尋ねてください。

于 2012-06-19T07:23:50.927 に答える
1

必要に応じa_tl.language_id = 2て、内部結合を強制します(a_tl.language_idがnullになることはありません)。

a_tl.language_id = 2のa_tlからの行のみで左結合する場合は、次のように記述します。

FROM      a 
          join b on (a.a_id= b.b_id)
          left join a_tl on ( a.a_id = a_tl.a_id and a_tl.language_id = 2)
          left join b_tl on ( b.b_id = b_tl.b_id and b_tl.language_id = 2 )
于 2012-06-19T07:26:59.893 に答える