2016-04-13 7 views
0

私はSQLに慣れていないので、サブクエリの使用と外部クエリに関する配置を把握するのに問題がありました。以下の質問は、作業中の問題の一部であり、目的の結果が得られないようです。SQLPLUS(Oracle) - 日付式がnより大きいかどうかを調べるためのサブクエリ日数

開始日から終了日までの日数を抽出する必要があります。それが2より大きいかどうかをチェックし、それを外側のクエリに適用します。この特定の試みは、 "不足している式"を返すが、他の反復(2番目のクエリベロー)は内部クエリが複数の行を返すというエラーを返す(適切な結果を生成しなかった)。

QUERY1

SELECT P.PETNAME,P.PETTYPE 
FROM PETTREATMENT PT, EXAMINATION E, PET P, TREATMENT T 
WHERE PT.EXAMNO = E.EXAMNO 
AND E.PETNO = P.PETNO 
AND PT.TREATNO = T.TREATNO 
AND (SELECT TO_DATE(PETTREATMENT.ENDDATE,'DD-MON-YYYY') - TO_DATE(PETTREATMENT.STARTDATE,'DD-MON-YYYY') AS TOTALDAYS FROM PETTREATMENT WHERE TOTALDAYS > 2) 
AND T.COST >100 
ORDER BY P.PETNAME; 

QUERY 2

SELECT P.PETNAME,P.PETTYPE 
FROM PETTREATMENT PT, EXAMINATION E, PET P, TREATMENT T 
WHERE PT.EXAMNO = E.EXAMNO 
AND E.PETNO = P.PETNO 
AND PT.TREATNO = T.TREATNO 
AND 2 < (SELECT TO_DATE(PETTREATMENT.ENDDATE,'DD-MON-YYYY') - TO_DATE(PETTREATMENT.STARTDATE,'DD-MON-YYYY') FROM PETTREATMENT) 
AND T.COST >100 
ORDER BY P.PETNAME; 
+0

現在のところ、その言い回しに従うのは少し難しいです。あなたのテーブル構造、いくつかのサンプルデータ、そしてこのサンプルのために得ようとしている結果を共有してください。 – Mureinik

答えて

0

は、古いスタイルのジョインの使用は避けてください。 enddateとstartdateはpettreatment tableから来ているので、すでにそれを選択している場合は、where節で条件を指定することができます。選択の必要はありません。

SELECT P.PETNAME,P.PETTYPE 
FROM PETTREATMENT PT 
JOIN EXAMINATION E ON PT.EXAMNO = E.EXAMNO 
JOIN PET P ON E.PETNO = P.PETNO 
JOIN TREATMENT T ON PT.TREATNO = T.TREATNO 
WHERE TO_DATE(PT.ENDDATE,'DD-MON-YYYY') - TO_DATE(PT.STARTDATE,'DD-MON-YYYY') > 2 
AND T.COST > 100 
ORDER BY P.PETNAME; 
+0

これはトリックでした、そして、その説明は理にかなっています。これらの結合は自然結合と見なされますか? – LCaraway

関連する問題