技術資料

PostgreSQLで複数テーブルを結合して効率的にデータ処理を行う方法

2007.11.26

error この記事は最終更新日から17年以上が経過しています。

PostgreSQLで複数のテーブルを結合して処理する方法のメモです。

「複数のテーブルを結合して集計する」というのがどういう意味かと言うと、例えばまず会員制のショッピングサイトなどでユーザーの情報を管理するDBがあると仮定します。
で、一つ目のテーブル「TABLE1」には下記のように、ユーザーID・ユーザーの氏名・ユーザーのメールアドレス等の基本情報が格納されているとします。

TABLE1
UserID UserName MailAddress
Amethyst 鬼瓦 権三郎 amethyst@amethyst-web.org
Alexandrite 俵田山 兼松 alexandrite@amethyst-web.org
Sapphire 平等院 鳳凰堂 sapphire@amethyst-web.org

次に、二つ目のテーブル「TABLE2」には、各ユーザーの購入商品の情報が格納されているとします。
例えば、注文ID・注文者のユーザーID・商品名・商品価格etc。

TABLE2
OrderID UserID ItemName ItemPrice
1 Amethyst 扇風機 2980
2 Amethyst エアコン 99800
3 Sapphire コーヒーメーカー 2800
4 Amethyst 電気コタツ 5800
5 Alexandrite 上戸彩写真集 4800
6 Sapphire マグカップ 1200
7 Alexandrite エロマンガ 980

さて、上記の注文商品の情報が格納されたTABLE2のデータを元に、注文したユーザー宛に一括で受注確認のメールを送信するプログラムを作りたい時、どうすれば良いでしょうか。

単純に処理しようと思えば、まずTABLE2のデータを一行ずつ取得し、その情報の中からユーザーIDを取得し、次にそのユーザーIDをキーにしてTABLE1からメールアドレスを取得、という流れになります。
perlで書くと、下記のような感じ

#-- TABLE2のデータを取得
$SQLstat1 = $DB->prepare("select OrderID, UserID, ItemName, ItemPrice from TABLE2");
#-- 一行ずつ処理する
while(@DATA = $SQLstat1->execute){
    #-- 取得したデータを変数にセット
    ($OrderID,$UserID,$ItemName,$ItemPrice) = @DATA;
    #-- $UserIDをキーにしてTABLE1のデータを取得
    $SQLstat2 = $DB->prepare("select UserName, MailAddress from TABLE1 where UserID = '$UserID'");
    #-- 取得したデータを変数にセット
    ($UserName,$MailAddress) = $SQLstat->execute;
    #-- 以下にメール送信の処理が入る
    &SendMail;
}

※上記の処理の場合は、実際にはプレースホルダを使った方が良いと思いますが、ここでは処理の流れをわかりやすくするために敢えてこういう記述にしました。

さて、上記のスクリプトの場合は一つ目のselect文の中で何度も別のselect文を発行していることになります。
が、select文にinner joinという句を使うと、一度のSQL文で上記の処理を済ますことができます。
↓こんな感じ。

#-- TABLE2のデータを元にTABLE1からUserIDをキーにしてデータを取得
$SQLstat = $DB->prepare("select TABLE2.OrderID, TABLE2.UserID, TABLE2.ItemName,
 TABLE2.ItemPrice, TABLE1.UserName, TABLE1.MailAddrss
 from TABLE2 inner join TABLE1 on TABLE2.UserID = TABLE1.UserID");
#-- 一行ずつ処理する
while(@DATA = $SQLstat->execute){
    #-- 取得したデータを変数にセット
    ($OrderID,$UserID,$ItemName,$ItemPrice,$UserName,$MailAddress) = @DATA;
    #-- 以下にメール送信の処理が入る
    &SendMail;
}

上記スクリプトの
from TABLE2 inner join TABLE1 on TABLE2.UserID = TABLE1.UserID
の部分がポイントです。
これは「TABLE2とTABLE1を結合するよ。条件として"TABLE2のUserIDとTABLE1のUserIDが同じ"データを結合してね」
ということです。
ちなみに、上記select文で出てくる TABLE2.OrderID とか TABLE1.UserID とかはそれぞれ「TABLE2内のOrderID」「TABLE1内のUserID」を表します。

このinner join句は、select文だけではなくupdate文にも使えますので何かと便利です。
delete文には使った記憶がないのでよくわかりません。多分使えるんじゃないですかね?

PerlのDBIモジュールで始めるPostgreSQLデータベース操作入門

2007.08.11

PerlでPostgreSQLデータベース操作を行うための「DBIモジュール」の基本的な使い方を解説します。接続方法やデータの追加・更新・削除・検索の操作に加え、効率的なSQL文の実行方法まで。

Perl PostgreSQL

PHPとPerlでファイルパーミッションを変更する方法(chmod関数)

2024.11.16

PHPとPerlには、ファイルのパーミッションを変更するためのchmod関数が標準で用意されています。この記事では、PHPとPerlそれぞれのchmod関数を使ったファイルパーミッション変更の基本的な使い方を紹介します。

Perl PHP

perlでの文字列置換と数値抽出の方法

2023.04.26

perlで特定の文字列から末尾のカンマ区切りの数値部分を抽出する方法を紹介します。s/// 演算子を使った文字列置換の例と、数値が含まれているかを正規表現でチェックする方法を解説します。

Perl

perlでMySQLを操作する基本的なテンプレート

2023.04.08

perlでMySQLデータベースを操作するための基本的なテンプレートを紹介します。DBIモジュールを使用してデータベースに接続し、SQLクエリを実行する方法を解説。

MySQL Perl

阿部辰也へのお仕事の依頼・お問い合わせ

お名前 *必須
会社名
メールアドレス *必須
電話番号
URL
お問い合わせのきっかけ
お問い合わせの内容 *必須
個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP