0

操作 (ope.ope_operationid で識別) に少なくとも特定のタイプ (opt.opt_id) の操作があるかどうかを知るために、SQL クエリ (oracle) を作成したいと考えています。結果のt。

たとえば、この操作 LAA351BP があり (これがベースに存在することはわかっています)、ID が 3781 の操作タイプが少なくともあるかどうかを知りたいです。 operationid とその横に「not found」などを出力します

使用する関数は 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'

ありがとう

4

1 に答える 1

5

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

以下は、(暗黙的ではなく) 明示的な結合を使用して書き直されたクエリです。

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'

編集

結合条件が欠落してod_equipment_typeいることが、JOIN 構文が好まれる理由です。元の SQL の末尾のカンマが削除されると、ステートメントによって不要なデカルト結合が作成され、関連するテーブルが大きい場合にサーバーに深刻な影響を与える可能性があります。

JOIN 構文を使用すると、そのようなタイプミスを防ぐ構文エラーが常に発生します。暗黙的な結合を使用すると、FROM リストにカンマを残した場合にのみエラーが発生しますが、FROM リストで結合条件を逃した場合はエラーになりません。WHERE

于 2012-04-21T21:27:11.353 に答える