- PR -

条件文がうまくできない・・

1
投稿者投稿内容
M
会議室デビュー日: 2005/12/27
投稿数: 11
投稿日時: 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)

よろしくお願いいたします。

背古井
常連さん
会議室デビュー日: 2004/04/02
投稿数: 39
投稿日時: 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 *」はあんまりお勧めしません。
後でなんの情報を取得したのかわかりづらくなる危険性があります。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-01-30 12:29
まず、SQLの質問をするときには
使用されているDBMSとそのバージョンを記述してくださいね。
DBMSにより書けるSQLに変化が出てくるので。

引用:

Mさんの書き込み (2006-01-30 10:13) より:

項目3については、「A.項目3=B.項目3」または「C.項目3=B.項目3」
というのが、条件なのです。

その場合、どんな風に、したらいいのでしょう。



こんなSQLでヒントになりますでしょうか?
(DBMSが何かを書かれていないので、とりあえずPostgreSQLで動作確認済み)

コード:
TEST1(PK = key)
key:col1
"000";"001"
"001";"000"
"002";"000"

TEST2(PK = key)
key:col1
"000";"000"
"001";"100"
"002";"200"

TEST3(PK = key + bkey)
key:bkey:col1
"000";"001";"abc"
"001";"001";"def"
"002";"001";"ghi"
"100";"001";"jkl"
"100";"002";"pqr"
"200";"001";"mno"



コード:
select test1.key "test1Key" , test1.col1 "test1Col1", test2.key "test2Key", test2.col1 "test2Col1", test3.key "test3Key", test3.col1 "test3Col1" from 
 test1, test2, test3
 where test2.key = test1.key and
       test3.key = case test1.col1 when '000' then test2.col1 else test1.key end



コード:
test1Key:test1Col1:test2Key:test2Col1:test3Key:test3Col1
"000";"001";"000";"000";"000";"abc"
"001";"000";"001";"100";"100";"jkl"
"001";"000";"001";"100";"100";"pqr"
"002";"000";"002";"200";"200";"mno"





引用:

@「CがAに対して複数ある場合に複数とれてしまう。」
A「CがAに対して0件の場合に、データがとれない。」


@に関しては背古井さんがおっしゃられているようにテーブル構造によっても
手はいろいろとあるので、一概には言えませんが、
取得したい列の値が重複するのを防ぎたいのであれば、DISTINCTがヒントになりますし、
データを取得する段階でCテーブルの行を1行にするために サブクエリなどがヒントになりますかね。

Aに関してはLEFT OUTER JOINがヒントになるとおもいます。

M
会議室デビュー日: 2005/12/27
投稿数: 11
投稿日時: 2006-01-30 13:17
ありがとうございます!!!

今、UNIONで試してみましたが、うまくいきそうな
雰囲気でした。

CASEは条件文の中でも使えるのですね・・
ありがとうございます!!!
試してみます。

DBMSとそのバージョンについて、記述なくすみません。。
MSDEでした。

本当に、ありがとうございました!!!

また、試してから、書き込みさせていただきます。

とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 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)の場合は、
コード:
SELECT * 

FROM
tableB as B
INNER JOIN
tableA as A
ON
B.項目1 = A.項目1
AND B.項目2 = A.項目2
WHERE
(B.項目3 = A.項目3
OR
EXISTS
(SELECT *
FROM tableC as C
WHERE
B.項目3 = C.項目3
AND A.項目4 = C.項目4
AND A.項目5 = C.項目5
AND A.項目3 = 0
  )
)
....



で、

2)の場合は、
コード:
SELECT * 

FROM
tableB as B
INNER JOIN
tableA as A
ON
B.項目1 = A.項目1
AND B.項目2 = A.項目2
WHERE
(B.項目3 = A.項目3
OR
EXISTS
(SELECT *
FROM tableC as C
WHERE 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
  )
)
....



で、出来そうに思えます。


[ メッセージ編集済み 編集者: とんくま 編集日時 2006-01-30 23:44 ]
M
会議室デビュー日: 2005/12/27
投稿数: 11
投稿日時: 2006-02-02 09:13
EXISTS・・

そういう方法もあるのですねー

みなさんありがとうございます。

大変たすかりました!

でも、また新たな問題が・・
新たに、トピックたてさせていただきます・・・

また、よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)