裏ブログ

家族には内緒のブログ

SQL データを横持ちにする方法

2006-01-15 01:31:49 | DB
分類 製品
01 01
01 02
01 03

上記のような一つの分類に対し、
複数の製品を持ったデータが存在
する場合に
一発のSQLを使用して
データを横もち状態にする方法を
ご教授願えますか?

(結果イメージ)
分類1 製品1 製品2 製品3
01 01 02 03
----------------------------------------------------
もし分類毎の製品の数に上限があって、なおかつ分類と製品の組み合わせに
関して重複レコードが存在しないのであれば、こんな感じでできると思います。

SELECT
   [分類],
   MAX(CASE WHEN [ID] = 1 THEN [製品] ELSE NULL END) AS [製品1],
   MAX(CASE WHEN [ID] = 2 THEN [製品] ELSE NULL END) AS [製品2],
   MAX(CASE WHEN [ID] = 3 THEN [製品] ELSE NULL END) AS [製品3]
FROM (
   SELECT COUNT(*) AS [ID], T1.[分類], T1.[製品] FROM [TABLE] AS T1
   INNER JOIN [TABLE] AS T2
   ON T1.[分類] = T2.[分類] AND T1.[製品] >= T2.[製品]
   GROUP BY T1.[分類], T1.[製品]
) AS T3
GROUP BY [分類]

Oracle JDBCでバインドできる文字列のサイズの制限

2006-01-15 01:30:29 | DB
Java.sql.PreparedStatementインターフェースを使用してOracleデータベースにデータを登録する際、setString()メソッドを使用してバインドできる文字列のサイズには制限があるようだ。


Oracleデータベースとしてのバインドサイズの上限はVARCHAR2、NVARCHAR2の最大サイズ(4000バイト)と同じなのだが、Oracle JDBCドライバでPreparedStatementインターフェースのsetString()メソッドを使用した場合、使用しているキャラクタ・セットによってより厳しいサイズ制限が課せられるらしい。

「Oracle9i JDBC開発者ガイドおよびリファレンス2(9.2)」の中の「ThinドライバによるSQL CHAR データ・サイズ制限」というトピックで解説されている内容を見ると、データベース・キャラクタセットがJA16SJISの場合、2000バイト(UTF-8バイト)が上限となっている。つまり、文字数で言うと日本語ばかりで666文字(UTF-8では日本語は3バイトで表される)が上限となるというわけだ。

※なぜUTF-8が出てくるのかと言うと、Oracle JDBCドライバは、CHAR またはVARCHAR2 バインドのために、Java UTF-16キャラクタをUTF-8エンコーディング・バイトに変換し、次にUTF-8 エンコーディング・バイトはデータベースに転送され、データベースはUTF-8 エンコーディング・バイトをデータベース・キャラクタ・セット・エンコーディングに変換するという内部的な仕組みになっているためだ。

この制限を超える文字列をsetString()によってバインドしようとした場合は


ORA-17070: データ・サイズがこの型の最大サイズを超えています。


というエラーが発生する。

このエラーを回避するためには、日本語で666文字を超えるような値をセットされる可能性のある文字列型の列に対しては、setString()ではなく、setCharacterStream()を使用して値をバインドする必要がある。


参考にしたURL:
http://redolog.livedoor.biz/archives/10156764.html

主な上場基準の例

2006-01-15 01:10:40 | 
                        
東京証券取引所第2部 ジャスダック
発行済み株式数 400万株 制限なし
会社設立後の年数 3年以上 制限なし
株主資本の額 10億円以上 2億円以上
株主数 800人以上 300人以上
直前期利益 4億円以上 プラスであること

SQL Aに有ってBに無いデータを取得する方法

2006-01-15 00:50:51 | DB
同じフィールドを持つ2個のテーブルからAテーブルにあってBテーブルにない
Aテーブルのレコードのみを取得しようと考えています。
inner join や left join では、AテーブルとBテーブルの共通データも出てきて
しまいます。

select A.* from A left join B on A.field1 = B.field1 where B.field1 is null;