こんにちわ!かーつんです!!
不定期更新SQLチューニング基礎3発目です。
ん~と、今回は「union (時と場合でminus)」です。
2つのテーブルの集計結果など、同時に取ってきたいとき。
まぁ、方法としては3種類。
1.2回クエリを投げて、PGで加工する。
2.副問い合わせでSQL内で加工する。
3.クエリ的には1回でunionで結果のみがっちゃんこ。
コスト的には、1<3<2の順で高くなるって感じでしょうか。
副問い合わせは使い方にも依りますが、mysqlで使うには少々気が咎める時がありますよね。
でも、どうしても2回クエリを投げれない(投げたくない)。ときってあると思うんです。
そんなとき、同じSQLを2回書いて、unionでくっつけて、結果にしてしまう。
こんな事をたまに思いつきます。
ただ、本来のunionの使い方は、結果の合成なので、
同じフィールド名を持つ違うテーブルの値を合算させてしまうのが定石なのですが、
あ え て、同じフィールド名をもつ違うテーブルの値に別名つけて別レコードとして、
同時に取得する。
まぁ、どういうことかというと、
SELECT COUNT(hoge) FROM exampleA;
SELECT COUNT(hoge) FROM exampleB;
というのを、
SELECT COUNT(hoge) AS hogeA FROM exampleA;
UNION
SELECT COUNT(hoge) AS hogeB FROM exampleB;
てな具合にかいて、
結果を
hogeA hogeB
100 200
という具合に取得するわけです。
PG内での加工は通常の結果より面倒ですが、
1度に取らなきゃいけないときに、1度で取れるのがメリットです。
なんかまぁ、基礎というより裏技っぽくなっちゃいましたが、
こんな事も出来ますよ。ってくらいで、知ってて損はないはずです。
あと、MySQLでは使えないのですが、
「MINUS」についても同じような使い方をすることが出来るときがあるので、
いろいろ工夫してみてください。
いじょ。かーつんがお送りしました。
かーつん MySQL, データベース
こんばんわ。かーつんです。
今回はちょっとしたツール作った時のメモをば。
Excelファイル選択ダイアログを出して、選択されたファイル名(パス付)をセルに格納する場合
こんな感じに、GetOpenFilename()を使う。
Private Sub selectFile()
Dim FileName As String
'-- ファイル名取得 --
FileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
If FileName = "False" Then
Exit Sub
End If
ActiveWorkbook.Sheets(1).Cells(1,1).Value = FileName
End Sub
「キャンセル」されたときは【False】が返ってくるからSubを抜けるようにしてエラー回避する。
ファイル名のみ欲しいときはFileNameを分割すればOK
フォルダを選択させて、フォルダ名(パス付)をセルに格納する場合
こんな感じに、FileDialog()を使う
Private Sub selectFolder()
Dim Folder As String
'-- フォルダ名取得 --
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
Folder = .SelectedItems(1)
Else
Exit Sub
End If
End With
ActiveWorkbook.Sheets(1).Cells(1,1).Value = Folder
End Sub
キャンセルされてもこいつは【Falseを返さない】。
調べるの面倒なので、選択されたときには結果を取得して、
それ以外はエラーでSubを終わらせてみた。
もっとスマートな書き方とかありそうだけど、
今回はツールなので、時間勝負ということで。。。
以上、ちょこっとメモでした。
かーつん その他
こんばんわ。かーつんです。
SQL負荷って、考えたことありますか?
条件などにもよりますが、
SELECT、INSERT、DELETE、UPDATE順に徐々に重くなります。
理由は簡単。
SELECT=検索
INSERT=挿入+インデックスレコード追加
DELETE=検索+削除+インデックスレコード更新
UPDATE=検索+更新+インデックスレコード更新
と、処理が増えるからです。
例えば、UPDATEを100回投げるなら、
TRUNCATE+INSERTの方が早い事もあります。
要するに更新が一番重く、検索が一番早いわけですね。
で、よくあると思いますが、
あればUPDATEかけて、なければINSERTというのを
SELECT+UPDATE+INSERTの組み合わせでやってる方が多いと思います。
そんなときは、迷わずREPLACEを使いましょう。
REPLACEは検索+[更新|挿入]+インデックス[更新|挿入]です。
上の例だと、
SELECT+(UPDATE or INSERT)=検索+[(検索+更新)|挿入]
REPLACE=検索+[更新|挿入]
どちらが早いか一目瞭然ですよね。
検索一回分REPLACEの方が早いです。
もちろん条件的に無理。ということもありますが、
使えるときは使っちゃった方が、処理が早いです。
プログラムで、
ファイルレコード1件ごとにSELECT投げて、
UPDATEかINSERTか判断して実行して、
これを1000回繰り返す。コレは悪です。やってたら犯罪です。
一括でファイル読み込んで、
一括でSELECT投げて、
REPLACEで一気に1000回更新
置き換えれる時は迷わず変えてしまいましょうネ
以上。か^-^つんがお送りしました。
かーつん MySQL, データベース
こんばんわ。かーつんです。
さっき調べてて分かったことを、
ちょこっと残しときます。
携帯でCSSを使うとき、
例えば以下のように書くと
style="font-size:xx-small"
携帯の機種によっては思わぬ表示が起こります。
今回遭遇したのは、xx-largeを指定していた文字同士が、
行間が狂って重なり合って表示される。
コレを解消するには。
style="font-size:xx-small;"
と、キチンと「;」を付け忘れることなく、
正しい書き方で書く。
そう。これだけ。。。
意外と忘れてしまいがちな「;」ですが、
PCでは何ともない事が携帯では大惨事に繋がるようです。
かーつん HTMLとか, 携帯電話
こにゃにゃちわ。
かーつんです。
『winmail.dat』ってご存じですか?
outlookからThunderbirdやBeckyに添付有メールを送ると、
良く出現するんですよね。
で、コイツいったい何者よ。と、調べたんですが、
MS曰く「RTF(リッチテキストファイル)の情報が格納されています。」
だそうです。
んじゃ、設定を「テキスト」にしてメールを作成してやると解消する。
って、思って設定変えて(MSのサポートページにも書いてある)、
再送信。
変わりません。。。。
どうやら、outlookにファイルを付けると(付けなくても稀に)、
勝手にRTFの情報を抱え込むようです。
まぁ、今時outlookなんかを使っていた私が悪いんですが、
取引先とメールやりとりするのに不具合出まくりというのも、
取引先に失礼極まりない事だと言うことで、メーラ変えました。
winmail.datにRTF情報を抱え込まれると、
添付ファイルもまとめて抱え込まれて、
知らない人は、添付ファイルが開けない。再送してもらおう。
となります。
とまぁ、こんな失敗談が役に立つかどうかは分かりませんが、
もし今outlookを使われている方がいらっしゃったら、
すぐにメーラを変えてしまいましょう。
アドレス帳や、今までのメールなどは、基本的に移し替えることも可能です。
仕分けルールなど、細かい設定が移せないのが難点ではありますが、
「ファイルが開けないよ。」「再送します。」「また開けないよ。」「再送します。」・・・
なんて事が起こる前にサクッと変えて、
使い方になれてしまった方が得策だと思います。
ちなみに、わたしはMS信者というわけではなく、
使えてたから使っていた。というレベルでした。
個人的には、移行させるならBeckyが一番かなと。
使い方似てますし、それほど苦労なく移行できると思います。
難点はシェアソフトなんで、お金が掛かるくらい。
お金かけたくない!というかたはThunderbird辺りが無難かと思います。
その他メーラも多々点在していますので、
自分に合ったメーラを見つけて移行してしまいましょう。
以上、か^д^んがお送りしました。
かーつん その他