- - PR -
データ結合でデータが途中で切れているときにNULLを入れたい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 申し訳ありませんがよろしくお願いします。 | ||||
|
投稿日時: 2007-11-02 18:27
left join でできませんかね。
| ||||
|
投稿日時: 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 の間違いですよね? | ||||
|
投稿日時: 2007-11-02 19:30
完全外結合(Full Outer Join)なら、A・B・Cのいずれかのテーブルにデータが
存在すれば、データを取得出来ます。 | ||||
|
投稿日時: 2007-11-03 15:56
まず、問題をややこしくなっているのは、そもそもテーブルが正規化されていないためだと思います。
(CODE, NAME, BIRTHDAY) の3列を、1つの CUSTOMER_ID などで代替するようにするのが一般的です。 また、SQL 文は、上記のような代替を使わずに無理やり書こうとするならば、FROM の中でのサブクエリーではなく、
のように SELECT 値リストの中でのサブクエリーで書くほうが、話が単純になって良いと思います。 (SQL 文は自信なし。雰囲気だけを示したものです。) -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} |
1