オラクルのSQLについて その3


テーブルAとBがあり
Aには 項目A1、項目A2、項目A3
Bには 項目B1、項目B2、項目B4
があるとします。

このとき、
項目A1と項目B1が 一致し
項目A2が項目B2の先頭一致の条件で一致するとき

項目A1 = 項目B1
項目A2 like ( 項目B2 & "%")
(項目B1は必須だが 項目B2がNullの時は、項目B2は条件に入れない)

この条件にあてはまる時、項目A1を項目B4にして出力したいのです。

項目A1 or 項目B4,項目A2,項目A3と出力させ、項目A1 or 項目B4でソートして出力したいのですが
どうすればいいでしょうか?




項目A1、項目A2、項目A3
1,210,1
4,51,2
5,644,3
5,6448,4
5,888,5

項目B1、項目B2、項目B4
1,,2
5,64,3

とあったとき

項目A1 or 項目B4、項目A2、項目A3
2,210,1
3,644,3
3,6448,4
4,51,2
5,888,5


と出力されるようなSQLを教えてください。
なお、SELECT文だけで やりたいのです。
別にテーブルを作成してUPDATEしてやれば簡単なんですけどね。

オラクルの得意な人、よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2006/08/07 17:34:52
  • 終了:2006/08/08 13:05:31

ベストアンサー

id:myawoo No.3

myawoo回答回数21ベストアンサー獲得回数32006/08/08 00:06:38

ポイント40pt

環境がないので確認はできませんでした

select

case when b.b4 is not null then b.b4 else a.a1 end as a1orb4,

a.a2,

a.a3

from a

left outer join b on a.a1 = b.b1 and (b.b2 is null or a.a2 like b.b2 || '%')

order by a1orb4

id:taknt

ばっちしですね。

2006/08/08 09:42:17

その他の回答(3件)

id:Allashe No.1

Allashe回答回数59ベストアンサー獲得回数52006/08/07 18:10:36

ポイント5pt

文字列接続演算子がちょっと怪しいです。

Oracle使ったこと無いもので・・

SELECT

CASE WHEN TABLE_A.A2 like (NVL(TABLE_B.B2,'') || "%")

THEN TABLE_B.B4 ELSE TABLE_A.A1 END AS A1_OR_B4,

TABLE_A.A2,TABLE_A.A3

FROM TABLE_A LEFT OUTER JOIN TABLE_B ON

TABLE_A.A1=TABLE_B.B1

id:taknt

動作は、明日、確認してみます。

SQLでCASE文を使うんですね。

こういうのは、やったことが なかったです。

残念ながら、A1_OR_B4の列にNullの値が入った行ができてしまいましたね。

あと、ソートが 抜けてます。

でも、SQLの作り方は 参考になりましたので、よかったです。

2006/08/08 09:10:44
id:freemann No.2

freemann回答回数315ベストアンサー獲得回数502006/08/07 23:43:50

ポイント30pt

これでよろしいかと

SELECT A1,A2,A3 FROM A

WHERE NOT EXISTS (SELECT *

FROM B

WHERE A1=B1 AND A2 LIKE B2 & '%')

UNION

SELECT B4,A2,A3 FROM A,B

WHERE A1 = B1 AND A2 LIKE B2 & '%'

id:taknt

どこでソートさせてるのか わかりませんが、ちゃんとソートされますね。

どういう感じでソートされるのか 教えてもらえないでしょうか?

ちょっと急ぎなので 別質問にします。

2006/08/08 13:03:22
id:myawoo No.3

myawoo回答回数21ベストアンサー獲得回数32006/08/08 00:06:38ここでベストアンサー

ポイント40pt

環境がないので確認はできませんでした

select

case when b.b4 is not null then b.b4 else a.a1 end as a1orb4,

a.a2,

a.a3

from a

left outer join b on a.a1 = b.b1 and (b.b2 is null or a.a2 like b.b2 || '%')

order by a1orb4

id:taknt

ばっちしですね。

2006/08/08 09:42:17
id:Allashe No.4

Allashe回答回数59ベストアンサー獲得回数52006/08/08 06:41:21

ポイント15pt

すみません。

最初の回答だと、A1=B1の時と、A1に対してB1が無いときの区別がつきません。下のようにして下さい。

SELECT

CASE WHEN TABLE_A.A2 like (NVL(TABLE_B.B2,'') || "%") AND TABLE_B.B1 is not null

THEN TABLE_B.B4 ELSE TABLE_A.A1 END AS A1_OR_B4,

TABLE_A.A2,TABLE_A.A3

FROM TABLE_A LEFT OUTER JOIN TABLE_B ON

TABLE_A.A1=TABLE_B.B1

id:taknt

あとは ソートだけでしたね。

でも、ほかの人の回答で だいたいOKなので ソートを入れたものの回答は不要です。

2006/08/08 09:48:16

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません