電子書籍の厳選無料作品が豊富!

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型の項目を
キーにして外部結合にするにはどうすれば良いのでしょうか?

A 回答 (3件)

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;
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/06 19:00

既に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)を使うしかなさそうです。
    • good
    • 0
この回答へのお礼

Oracleのバージョンは10gです。
試してみたところ、TRUNCを使用した行で
「ORA-00904:"A"."Y":無効な識別子です」
のエラーになってしまいました。

取り急ぎn_breakdownさんに教えて頂いた方法をとり、
上記エラーについては後日調べてみることにします。
どうもありがとうございました。

お礼日時:2006/11/06 19:21

SELECT A.X


FROM A,B
WHERE A.X = B.Z (+)
AND TRUNC(A.Y) = TRUNC(B.W) (+)
AND B.Z IS NULL;

でうまくいきませんか?

この回答への補足

ご回答ありがとうございます。
教えて頂いた通りにやってみましたが、やはり同じ
「ORA-00936: 式がありません」
のエラーが出てしまいます…

それからすみません、質問文を間違えてしまいました。
最初のSQLの実行結果は「レコードが選択されませんでした」ではなく、
全てのレコードが選択されてしまいます。

補足日時:2006/11/06 17:13
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報