- PR -

データ結合でデータが途中で切れているときにNULLを入れたい

1
投稿者投稿内容
ハチャ
会議室デビュー日: 2007/10/01
投稿数: 11
投稿日時: 2007-11-02 17:23
たとえば
CODE|NAME|BIRTHDAY|HIDUKE|KAZU
というテーブルがあり、それを指定した日付の範囲内(5日間など)で
横にKAZUを連結して表示したいのですが
速度を考え以下のようなSQLになりました。

****************************************************************************
SELECT
*
FROM
(SELECT
A.CODE,A.NAME,A.BIRTHDAY,KAZU_A,KAZU_B,KAZU_C
FROM
(SELECT CODE,NAME,BIRTHDAY,HIDUKE,KAZU AS KAZU_A FROM MST WHERE HIDUKE=2007/11/02) A,
(SELECT CODE,NAME,BIRTHDAY,HIDUKE,KAZU AS KAZU_B FROM MST WHERE HIDUKE=2007/11/03) B,
(SELECT CODE,NAME,BIRTHDAY,HIDUKE,KAZU AS KAZU_C FROM MST WHERE HIDUKE=2007/11/04) C
WHERE
A.CODE=B.CODE AND A.CODE=B.CODE)
AS X
ORDER BY BIRTDAY
******************************************************************************

しかし、もしひとつでもDBにデータがないと結合されたものは出てきません。
(上の例では11/2、11/3のデータがあるのに11/4がないとデータはない)
私の希望としてはデータがない場合はNULLを挿入したいのですが
どのように書けば実現できるでしょうか?
例:
11/2・11/3データあり 11/4データなし
CODE|NAME|BIRTHDAY|KAZU_A|KAZU_B|KAZU_C
1999|ハチャ|1980/11/11|  50|  32|  NULL

申し訳ありませんがよろしくお願いします。


べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-11-02 18:27
left join でできませんかね。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2007-11-02 18:40
left join で出来そうですが、テーブルAが無かった場合がダメですね。

日付のテーブルを作ってそれとleft join すればいいかも

ちなみにWHERE句が
WHERE
A.CODE=B.CODE AND A.CODE=B.CODE
になってますが
WHERE
A.CODE=B.CODE AND A.CODE=C.CODE
の間違いですよね?
上総
大ベテラン
会議室デビュー日: 2006/06/22
投稿数: 107
投稿日時: 2007-11-02 19:30
完全外結合(Full Outer Join)なら、A・B・Cのいずれかのテーブルにデータが
存在すれば、データを取得出来ます。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-03 15:56
まず、問題をややこしくなっているのは、そもそもテーブルが正規化されていないためだと思います。
(CODE, NAME, BIRTHDAY) の3列を、1つの CUSTOMER_ID などで代替するようにするのが一般的です。

また、SQL 文は、上記のような代替を使わずに無理やり書こうとするならば、FROM の中でのサブクエリーではなく、
コード:
SELECT MAX(A.CODE), MAX(A.NAME), MAX(A.BIRTHDAY) AS MAXB, 
(SELECT KAZU FROM MST AS B WHERE B.HIDUKE=2007/11/02 
AND A.CODE=B.CODE AND A.NAME=B.NAME AND A.BIRTHDAY=B.BIRTHDAY),
(SELECT KAZU FROM MST AS B WHERE B.HIDUKE=2007/11/03 
AND A.CODE=B.CODE AND A.NAME=B.NAME AND A.BIRTHDAY=B.BIRTHDAY),
(SELECT KAZU FROM MST AS B WHERE B.HIDUKE=2007/11/04 
AND A.CODE=B.CODE AND A.NAME=B.NAME AND A.BIRTHDAY=B.BIRTHDAY)
FROM MST AS A
WHERE A.HIDUKE=2007/11/02 OR A.HIDUKE=2007/11/03 OR A.HIDUKE=2007/11/04
GROUP BY A.CODE, A.NAME, A.BIRTHDAY
ORDER BY MAXB


のように SELECT 値リストの中でのサブクエリーで書くほうが、話が単純になって良いと思います。
(SQL 文は自信なし。雰囲気だけを示したものです。)

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
1

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