- - PR -
条件文がうまくできない・・
1
| 投稿者 | 投稿内容 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-30 10:13
はじめましてこんにちは!!
SQLとにかく苦手です・・ 質問もどのようにしたらよいのかわからないのですが、 ぜひぜひ教えてください!! よろしくお願いいたします。 テーブルAとBとCがあります。 AとCは親子関係で、1対Nになります。(Nが0の場合もあります。) Bは、Aと1対1です。 AとBの結合条件は、複数項目ありますが、そのうちの1項目が、 Aに入っていない場合があります。 つまり、 ..WHERE A.項目1=B.項目1 and A.項目2=B.項目2 and A.項目3=B.項目3 というような結合条件なのに、「A.項目3」が0になってる場合 があるのです。 その場合は、AとCを結合させて、C.項目3を取得し、 B.項目3と一致するデータを取得したいのです。 項目3については、「A.項目3=B.項目3」または「C.項目3=B.項目3」 というのが、条件なのです。 その場合、どんな風に、したらいいのでしょう。 今までに試してみたのは、以下@Aです。 @「CがAに対して複数ある場合に複数とれてしまう。」 以下sqlです。 SELECT * FROM (( tableB as B LEFT JOIN tableA as A ON B.項目1 = A.項目1 AND B.項目2 = A.項目2 AND B.項目3 = A.項目3 ) LEFT JOIN tableC as C B.項目1 = C.項目1 AND B.項目2 = C.項目2 AND B.項目3 = C.項目3 AND A.項目4 = C.項目4 AND A.項目5 = C.項目5 AND A.項目3 = 0 ) WHERE .. A「CがAに対して0件の場合に、データがとれない。」 以下SQLです。 SELECT * FROM tableA as A, tableB as B, (SELECT CC.項目3 FROM tableC CC, tableA AA WHERE AA.項目1 = CC.項目1 AND AA.項目2 = CC.項目2 AND AA.項目3 = CC.項目3 AND AA.項目4 = CC.項目4 AND AA.項目5 = CC.項目5 AND AA.項目3 = 0 ) as C WHERE B.項目1 = A.項目1 AND B.項目2 = A.項目2 AND (B.項目3 = A.項目3 OR B.項目3 = C.項目3) よろしくお願いいたします。 | ||||||||||||||||||||
|
投稿日時: 2006-01-30 10:47
こんにちは、
tableA,tableB,tableCの構造がわからないので多少違う可能性もありますが、 もしtableCが項目1,項目2,項目3とも持っているのであれば ---- 以下sql文 select a.項目1 ,a.項目2 ,a.項目3 ,b.項目4 from ( select 項目1 ,項目2 ,項目3 from tableA UNION 項目1 ,項目2 ,項目3 tableC ) a left join tableB b on a.項目3 = b.項目3 --- 以上SQL文 で取得できます。 tableCに項目3しかない場合はもうちょっと面倒くさいです。 その場合は、テーブル構造を教えてください。 なお、基本的に「select *」はあんまりお勧めしません。 後でなんの情報を取得したのかわかりづらくなる危険性があります。 | ||||||||||||||||||||
|
投稿日時: 2006-01-30 12:29
まず、SQLの質問をするときには
使用されているDBMSとそのバージョンを記述してくださいね。 DBMSにより書けるSQLに変化が出てくるので。
こんなSQLでヒントになりますでしょうか? (DBMSが何かを書かれていないので、とりあえずPostgreSQLで動作確認済み)
@に関しては背古井さんがおっしゃられているようにテーブル構造によっても 手はいろいろとあるので、一概には言えませんが、 取得したい列の値が重複するのを防ぎたいのであれば、DISTINCTがヒントになりますし、 データを取得する段階でCテーブルの行を1行にするために サブクエリなどがヒントになりますかね。 Aに関してはLEFT OUTER JOINがヒントになるとおもいます。 | ||||||||||||||||||||
|
投稿日時: 2006-01-30 13:17
ありがとうございます!!!
今、UNIONで試してみましたが、うまくいきそうな 雰囲気でした。 CASEは条件文の中でも使えるのですね・・ ありがとうございます!!! 試してみます。 DBMSとそのバージョンについて、記述なくすみません。。 MSDEでした。 本当に、ありがとうございました!!! また、試してから、書き込みさせていただきます。 | ||||||||||||||||||||
|
投稿日時: 2006-01-30 23:41
> AとCは親子関係で、1対Nになります。(Nが0の場合もあります。)
AとCの関係付けは、 1)A.項目4 = C.項目4 AND A.項目5 = C.項目5 と 項目4、項目5だけでいいのでしょうか? それとも 2)A.項目1 = C.項目1 AND A.項目2 = C.項目2 AND A.項目4 = C.項目4 AND A.項目5 = C.項目5 と項目1、項目2についても同じ必要が有りますか? 1)の場合は、
で、 2)の場合は、
で、出来そうに思えます。 [ メッセージ編集済み 編集者: とんくま 編集日時 2006-01-30 23:44 ] | ||||||||||||||||||||
|
投稿日時: 2006-02-02 09:13
EXISTS・・
そういう方法もあるのですねー みなさんありがとうございます。 大変たすかりました! でも、また新たな問題が・・ 新たに、トピックたてさせていただきます・・・ また、よろしくお願いします。 | ||||||||||||||||||||
1
