2012-04-21 8 views
0

に私は(ope.ope_operationidによって識別される)操作 の少なくとも動作を有しているかどうかを知るために、SQLクエリ(オラクル) を記述したいと、見つからない場合でも行を返します特定のタイプ(opt.opt_id)、そうでない場合は結果に含まれていないことを示します。SQLクエリは、少なくともパラメータ

例えば、私は、この操作LAA351BPを有する(私はこの1つは、ベース内に存在知っている)、 、私はそれが持っている、すべてを印刷する場合、IDは3781. 少なくとも操作型を有するかどうかを知りたいです表示されていない場合は、操作ID とその隣に「見つからない」という文字を表示してください。

nvlは使用する関数ですか?私はそれが正しく動作するようにはできないようです。

SELECT DISTINCT ope.ope_operationid, 
ser.ser_code, 
opt.opt_code, 
ost.ost_code 
FROM od_operation ope, 
od_service_type ser, 
od_operation_type opt, 
od_status_type ost, 
od_equipment_type eqt, 
WHERE ope.ser_id = ser.ser_id 
AND  opt.opt_id = ope.opt_id 
AND  ost.ost_id = ope.ost_id 
AND  ope.opt_id = 3781 
AND  ope.ope_operationid = 'LAA351BP' 

おかげ

答えて

5

あなたは、標準的なJOIN構文を使用して開始する必要があります。あなたがWHERE節の実際の結合条件を忘れてしまった場合、(少なくとも私の意見では)読みやすくすることは別として、偶然のデカルト結合からあなたを守ります。さらに、Oracleによって使用されるclunky (+)構文(JOIN構文にはいくつかの制限があります)とは対照的に、ほぼすべてのDBMSで移植可能です。

明示的(暗黙的ではなく)参加する:結合構文が好まれる理由は、まさにod_equipment_typeに結合条件を欠け

SELECT DISTINCT ope.ope_operationid, 
     ser.ser_code, 
     opt.opt_code, 
     ost.ost_code 
FROM od_operation ope, 
    LEFT JOIN od_service_type ser ON ope.ser_id = ser.ser_id 
    LEFT JOIN od_operation_type opt ON opt.opt_id = ope.opt_id 
    LEFT JOIN od_status_type ost ON ost.ost_id = ope.ost_id 
    LEFT JOIN od_equipment_type eqt ON ???????? 
WHERE ope.opt_id = 3781 
AND ope.ope_operationid = 'LAA351BP' 

編集です。元のSQLの末尾のカンマが削除された場合、関連するテーブルが大きければ、サーバに重大な影響を与える不要なデカルト結合が作成されます。

JOIN構文では、構文エラーが発生し、このような誤植を防ぐことができます。暗黙的な結合を使用すると、FROMリストにコンマを残してもエラーは発生しますが、WHERE

+0

+1の結合条件が不足している場合には、決してエラーになりません。途中にランダムな 'od_equipment_type eqt'を持っていますが、OPもそうです。 – Ben

+0

@Ben:ありがとうございます。私はこれが明示的なJOINを使うことの利点を示す状況である理由を説明するコメントを追加しました –

関連する問題