こんにちは、ねこです。

自称プログラマのおばちゃんのブログです。いろいろあるよねぇ~。

SQL DB2 AS400 こんな風にBetween使います。

2014-03-17 14:57:09 | 便利なSQL
あぁ、忙しい。。

なかなかノートが取れません。すみません。

で、短し、行きます。

たとえば、検索エンジンを構築するとします。
もちろん、XDPやデータ全部送ってローカルに処理させるなんてこと、しませんねぇ。
だって検索結果のデータが山ほどあったらどうしますか?!

ってなわけで、表示最初のレコード番号と最後のレコード番号を静的にSQLでとって、そのパラメータをおくることで、細切れにデータ送信させます。同じ検索クエリーなので、結果は常時変わるものを除いて、同じレコード番号となります。
最初は1番から20番までを表示、「次へ」のリンクで21番から30番ってなかんじで、パラメータをおくり、SQLで処理させたものをうけとれば、めっちゃでかいデータをやり取りせずにいけます。特にWSDLなんかでOKですね。

で、こんな感じのSQL

select row_number() over(order by num), t.num, A, B, C from (
select row_number() over(order by A) as num, A, B, C from testfile where C > '0001-01-01' and B = 'OWT' and UPPER(A) like UPPER('Adams%')
) as t
where t.num between 3 and 5 order by num

さぁ、かえろー!

Group byで得た結果から、他のフィールド集計のSUM()結果を得る。(ちょおー短し)

2014-01-22 09:46:25 | 便利なSQL
笑わないでください。

SQL初心者のねこにとってはとても重宝してるステートメントです。

ここでやっているのは、それぞれのPDESIDに対して、PFIのフィールドにいくつユニークなデータが入っているか求めてから、その数をTESTという名で集計させてます。

データの確認によし。

select sum(test) as test from (

select count(distinct pfi) as test
from padata, schmstp
where npdesid = prgid1
group by pdesid

)
temp

ねこでした。

SQL: 同じデータをひとつのテーブルから見つけ出す方法 (長し)

2014-01-03 07:23:41 | 便利なSQL
遅かりし明けおめです。

すっかり二日も休んでました。
先週と今週の水曜日にクリスマス、正月と飛び飛び休日だったんで、なんだか働くのが馬鹿らしくなってきてます。
しかぁーし、来週からまったく通常の業務スケジュールでそこへ突入するのが怖い。。。
ふんどし締めてくぞー!

で、SQLです。
ねこはあまり得意ではありませんが、同じデータをひとつのテーブルから見つけ出す方法や、簡単にバックアップを取っちゃう方法なんかは初心者レベルではありますが、とても便利です。

1.同じデータをひとつのテーブルから見つけ出す方法

select unique_aaa, bbb, ccc
from tamatable t where exists
(select unique_aaa, bbb, ccc
from tamatable where t.unique_aaa = unique_aaa
and t.bbb = bbb and t.ccc = ccc
group by unique_aaa, bbb, ccc having count(unique_aaa) > 1)

2.二つのテーブルを比べる方法

select min(test) as test, aaa, bbb, ccc
from(
select 'tamatable' as test, t.aaa, t.bbb, t.ccc
from tamatable t
union all
select 'miketable' as test, m.aaa, m.bbb, m.ccc
from miketable m
)temp
group by aaa, bbb, ccc
having count(*) = 1

3.データごとに番号を振り当てる方法

select row_bunber() over(order by aaa) as rownumber,
aaa, bbb, ccc from tamatable order by aaa

4.長いテキスト順に表示する方法(これはテストデータを取るときによく使います。)

select aaa, length((trim(nagainamae1) ||' ' || trim(nagainamae2)) as len,
(trim(nagainamae1) ||' ' || trim(nagainamae2)
from tamatable order by len

で、とった後のデータをうまい具合に
nagainamae1 : nagainamae2
と表示し、尚且つ73以上の字数の場合に折り返すようjavascriptで制御するとこうなります。

//thisとは表示したいテキストフィールドのことです。
this.rawValue = nagainamae1.rawValue+" : "+nagainamae2.rawValue;
//ここで『:』を探させてその位置を得ます。
var vSymb = this.rawValue.indexOf(":");
//その位置までの文字、すなわちnagainamae1をvTopと定義付けます。vSecoundLineはそれ以降の終わりまでの文字となります。
var vTop = this.rawValue.substring(0,vSymb);
var vSecondLine = this.rawValue.substring(vSymb+1);

//ここでこのテキストフィールドの文字数を制限します。
if (this.rawValue.length > 73){ //全体数が73文字より大きいものを以下に適用。
vS1 = vSecondLine.substring(0,73);
var vBlank = vS1.lastIndexOf(" "); //73文字中、一番右側にある空白をvBlankとして得ます。
vThirdLine = vSecondLine.substring(vBlank+1); //vBlank以降の文字をvThirdLineに定義つけます。
vSecondLine = vSecondLine.substring(0,vBlank); //またvSecondLineの定義を空白のvBlankまでと再度定義つけます。
this.rawValue = vTop+":\n"+vSecondLine+"\n"+vThirdLine; //『+"\n"+』をつかって折り返し地点をつけます。
}

たぶんね、ちゃんとループをつかってやればもっと自由な動的な動きができるんだろうけど、今は時間の都合でこれが精一杯。すまぬ。

5.バックアップテーブルなどのテーブルのコピーをとる方法。

create table tamatable_backup as (
select * froj from tamatable)
with data

AS400 DB2ではジャーナルが取れませんのであしからず。

6.バックアップの復元方法。

まずはやっちまった方を削除して
delete from tamatable

バックアップテーブルを挿入してやる。
insert into tamatable select from tamatable_backup

7.二つのまったく違うテーブルをキーフィールドを頼りにアップデートする方法。

UPDATE CITY_TABLE
SET POPULATION = (
SELECT P2.POPULATION2010 AS NUMERIC
FROM NEW2010TABLE P2
WHERE CITY = P2.PLACE_NAME
),
USERID = 'DEQ081',
CDATE = '2011-07-05'
WHERE
EXISTS(SELECT 1 FROM NEW2010TABLE P2
WHERE CITY = P2.PLACE_NAME)

これであれば、フィールド数などがちがっててもキーさえあえばすんなりとアップデートしてくれます。

ついでをいうと、AS400のデータテーブル格納テーブルはだいたいQSYS2.SCHEMATAがライブラリーで、それとQSYS2.SYSTABLESがフィジカル・ロジカルファイル名です。

今日のメモはここまで、おしまいっ!さぁ、仕事しよ。