• ベストアンサー

SQL文で質問です

SQL文で質問です。 テーブルA X NUMBER型 Y DATE型(年月日と時間) テーブルB Z NUMBER型 W DATE型(年月日) A,BをAを主テーブルとして外部結合し、同じ年月日でBには無いデータ を取得したいのですが、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND A.Y = B.W(+) AND B.Z IS NULL; というSQL文を実行すると、テーブルAには時間まで登録されているので 実際には取得したいデータが存在しても 「レコードが選択されませんでした」 になってしまいます。このため、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND TO_DATE(A.Y,'YYYY/MM/DD') = TO_DATE(B.W,'YYYY/MM/DD')(+) AND B.Z IS NULL; としてみたところ、今度は3行目で 「ORA-00936: 式がありません」 というエラーになってしまいます。 外部結合にしたことがエラーの原因のようなのですが、DATE型の項目を キーにして外部結合にするにはどうすれば良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

ORACLEの外部結合の演算子(+)は式には利用できません。よって、TO_DATE内の列に(+)を指定してみてください。 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND TO_DATE(A.Y,'YYYY/MM/DD') = TO_DATE(B.W(+),'YYYY/MM/DD') AND B.Z IS NULL;

hidi
質問者

お礼

TO_DATE内に(+)を入れたところ、期待通りの結果を得ることが出来ました。 どうもありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

既にn_breakdownさんに書かれてしまいましたが SQLリファレンスの「SQL問い合わせ及び副問い合わせ」の「結合」に 「結合演算子(+)は任意の式ではなく、列にのみ適用することができます。」 とありますので、TO_DATEやTO_CHAR、truncではエラーになります。 9i以降であればleft joinを使って select a.x from a left join b on a.x=b.z and trunc(b.w) =trunc(a.y) where b.z is null ではどうでしょうか? #8iだとちょっと副問い合わせ(もしくはview)を使うしかなさそうです。

hidi
質問者

お礼

Oracleのバージョンは10gです。 試してみたところ、TRUNCを使用した行で 「ORA-00904:"A"."Y":無効な識別子です」 のエラーになってしまいました。 取り急ぎn_breakdownさんに教えて頂いた方法をとり、 上記エラーについては後日調べてみることにします。 どうもありがとうございました。

すると、全ての回答が全文表示されます。
回答No.1

SELECT A.X FROM A,B WHERE A.X = B.Z (+) AND TRUNC(A.Y) = TRUNC(B.W) (+) AND B.Z IS NULL; でうまくいきませんか?

hidi
質問者

補足

ご回答ありがとうございます。 教えて頂いた通りにやってみましたが、やはり同じ 「ORA-00936: 式がありません」 のエラーが出てしまいます… それからすみません、質問文を間違えてしまいました。 最初のSQLの実行結果は「レコードが選択されませんでした」ではなく、 全てのレコードが選択されてしまいます。

すると、全ての回答が全文表示されます。

関連するQ&A