- PR -

SQLの質問ですが。。。

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 81
投稿日時: 2004-12-18 19:49
いつもお世話になります。
SQLを作成していて、教えて頂きたいことがあります。
お忙しいところ、よろしくお願いします。
(Oracle9)

■サービステーブル(Service)
---------------------------------------------------
BeCode | TorihikiCodo | ServiceCode | ServiceMei |
---------------------------------------------------
b01 | t01 | s01 | smei01 |
b01 | t02 | s02 | smei02 |
b01 | t03 | s03 | smei03 |
b09 | t09 | s09 | smei09 |
---------------------------------------------------
※BeCode、TorihikiCodo、ServiceCodeはキー

■利用者テーブル(Ryousha)
----------------------------------------------------
RyoushaCode | Becode | TorihikiCodo | ServiceCode |
----------------------------------------------------
r01 | b01 | t01 | s01 |
r03 | b01 | t03 | s03 |
----------------------------------------------------
※RyoushaCodeキー

■取引テーブル(Torihiki)
-----------------------------
TorihikiCodo | TorihikiMei |
-----------------------------
t01 | tmei01 |
t02 | tmei02 |
t03 | tmei03 |
t04 | tmei04 |
t05 | tmei05 |
-----------------------------
※TorihikiCodoはキー

■欲しい結果
------------------------------------------------------------
R_RyoushaS | R_ToriSer | R_ToriMei | R_SerMei | R_Ryousha |
------------------------------------------------------------
| t01s01 | tmei01 | smei01 | r01 |
未 | t02s02 | tmei02 | smei02 | |
| t03s03 | tmei03 | smei03 | r03 |
------------------------------------------------------------

■作成SQL
SELECT
-- R_RyoushaS: as R_RyoushaS,
Service.TorihikiCodo || Service.ServiceCode as R_ToriSer,
Torihiki.TorihikiMei as R_ToriMei,
Service.ServiceMei as R_SerMei,
-- R_Ryousha: as R_Ryousha

FROM
Service, Ryousha, Torihiki

WHERE
Service.BeCode = 'b01' AND
Service.TorihikiCodo = Torihiki.TorihikiCodo AND

■教えて頂きたいこと
R_RyoushaSは、ServiceテーブルのTorihikiCodoとServiceCodeの
両方をキーとしてRyoushaテーブルのTorihikiCodoとServiceCodeの
両方と一致するレコードがあれば、何の表示せず、
一致するレコードがなければ'未'を表示したいのです。
R_Ryoushaには未の代わりにRyoushaCodeを表示したいのです。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-12-18 20:16
手元に Oracle がないので適当に書いていますが、
コード:
SELECT	
	CASE WHEN Ryousha.RyoushaCode IS NULL THEN '未' ELSE NULL END AS R_RyoushaS,
	Service.TorihikiCodo || Service.ServiceCode AS R_ToriSer,
	Torihiki.TorihikiMei AS R_ToriMei,
	Service.ServiceMei AS R_SerMei,
	Ryousha.RyoushaCode AS R_Ryousha
FROM	
	Service
INNER JOIN	
	Torihiki
ON	
	Service.BeCode = 'b01' AND
	Service.TorihikiCodo = Torihiki.TorihikiCodo
LEFT JOIN	
	Ryousha
ON	
	Service.BeCode = Ryousha.BeCode AND
	Service.TorihikiCodo = Ryousha.TorihikiCodo AND
	Service.ServiceCode = Ryousha.ServiceCode

あたりでどうでしょうか。
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2004-12-19 00:06
実際に動かしてみたわけではないので、間違っているところがあるかもしれませんが、
こんな感じでどうでしょうか。

UNION ALL の前が TorihikiCode と ServiceCode が存在するとき、後が存在しないときです。

SELECT
NULL,
Ryousha.TorihikiCodo||Ryousha.ServiceCode AS R_ToriSer,
(SELECT
TorihikiMei
FROM Torihiki
WHERE Torihiki.TorihikiCode = Riyousha.TorihikiCode
) AS R_ToriMei,
Service.ServiceMei AS R_SerMei,
R_Ryousha AS R_Ryousha
FROM
Service, Riyousha
UNION ALL
SELECT
'未',
Ryousha.TorihikiCodo||Ryousha.ServiceCode AS R_ToriSer,
(SELECT
TorihikiMei
FROM Torihiki
WHERE Torihiki.TorihikiCode = Riyousha.TorihikiCode
) AS R_ToriMei,
Service.ServiceMei AS R_SerMei,
R_Ryousha AS R_Ryousha
FROM
Riyousha
WHERE NOT EXISTS (
SELECT *
FROM Service
WHERE Service.TorihikiCode = Riyousha.TorihikiCode
AND Service.Service = Riyousha.Service
);
1

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