聖根のアジト:メモ:プログラミングメモ

プログラミングメモ

C++関連
Python関連
ツクール関連
DirectX7からDirectX9への移行メモ

JOINについてのあれこれ
PostgreSQLで重複行削除
related_nameとsetとannotate
プログラミング言語による剰余(余り)や累乗の表現


JOINについてのあれこれ

SQL言語のJOINには、
INNER JOIN、LEFT (OUTER) JOIN、RIGHT (OUTER) JOIN、FULL (OUTER) JOIN、CROSS JOINがある。
LEFT JOIN、RIGHT JOIN、FULL JOINは、まとめてOUTER JOINと呼ばれる。

ここで、INNER JOINとOUTER JOINは対義のような名前になっているが、
かなり性質の違うものだと思う。

INNER JOINは、結合先で条件に合うレコードの組がn個あれば、
シンプルにn個のレコードが結果に追加される。0個ならば何も追加されない。
対してLEFT JOINは、n>0ならばn個、n=0ならば片方の分が空白となっている
1個のレコードが追加されるという、少々複雑な処理を行っている。

また、対義的に見るならば、INNER JOINとFULL JOINを対立関係に置いた方が解り易い。
その間にLEFT JOINとRIGHT JOINが来る。

本来、OUTER JOINと呼ぶべきものは、条件に合ったレコードと結合したものに、
片方の分が空白のレコードと結合したものを加えたものであると思う。

CROSS JOINは結局の所、INNER JOINを無条件で行うものと等しく、
INNER JOINの一種という扱いができる。
OUTER JOINと異なり、いずれか片方のテーブルが空の場合は、
空の結果となる点に注意が要る。

対して、無条件のFULL JOINは、
レコードが0〜1の2つのテーブルを単にくっつけたい場合に使える。
CROSS JOINよりも使い道があるのではないかと思うが、
CROSS JOINのような特殊な呼び方が見当たらないのが不可解。

2023.6.3


PostgreSQLで重複行削除

PostgreSQLで、全く同じ内容のレコードを作ってしまった場合に、
これを片方だけ削除する方法に困っていた。
データベース管理システムによっては行ポインタというものが存在するそうで、
利用できそうだが、PostgreSQLの場合はそれも見当たらない。
PostgreSQLの場合はoidというものがそれに相当しているらしいが、無いと言われる。

そんな中、ctidを利用する事で解決することがわかった。
ctidはユニークな隠しレコードみたいなもので、
SELECT ctid,* FROM (テーブル名);
の形で、各レコードデータとの対応表が得られる。
後はWHERE句で
ctid='(0,13)'
のように指定する事で、レコードを特定できる。

ctidは、update毎にカウントされるが、
vacuum full (テーブル名);
とする事で振り直される。

2022.3.24


プログラミング言語による剰余(余り)や累乗の表現

剰余累乗整数除算
(整数型同士)
非等値コメント
ExcelMOD(A; B)A ^ BROUNDDOWN(A / B)A <> B
CA % Bpow(A, B)A / BA != B//
BASICA mod BA ^ BA \ BA <> B'
JavaA % BMath.pow(A, B)A / BA != B//
JavaScriptMath.trunc(A / B)
PerlA % BA ** Bint(A / B)A != B#
RubyA / B
PythonA // B

2021.3.17


ゲームシステム関連の考察とか
メモに戻る
トップに戻る