例: 表の結合

ユーザーの母集団と、それらのユーザーが送受信した電子メールを追跡するアプリケーションを考えてみます。SQL for Oracle NoSQL Databaseが現在汎用結合をサポートしていない場合、電子メールはユーザーの子として作成された表に格納されるため、NESTED TABLES句を使用して両方の表の情報を結合する問合せを作成できます。2つの表のcreate table文を次に示します。アプリケーションがusers表のユーザーに関連付けられていない電子メールを受信する可能性があります。そのような電子メールには、users表に存在しないuid値が割り当てられます。

CREATE TABLE users(
uid INTEGER,
name string,
email_address string,
salary INTEGER,
address json,
PRIMARY KEY(uid));

CREATE TABLE users.emails(
eid INTEGER,
sender_address string, // sender email address
receiver_address string, // receiver email address
time timestamp(3),
size INTEGER,
content string,
PRIMARY KEY(eid));

users表とemails表に書き込むことができる2つの問合せを次に示します。

例6-50 表の結合

給与が200 Kを超えるすべてのユーザーが2017年に送信した電子メールの数をカウントします

SELECT count(eid)
FROM NESTED TABLES(
users
descendants(users.emails ON email_address = sender_address and
year(time) = 2017)
)
WHERE salary > 200;

上の問合せでは、count(*)ではなく、count(eid)を使用しています。電子メールを持たないユーザーや電子メールを送信しなかったユーザーが存在する可能性があるためです。このようなユーザーの場合、FROM句はeidフィールドがNULLであるレコードを返し、count(eid)はそのようなレコードをカウントしません。

例6-51 表の結合

サイズが100 KBを超える、users表のユーザーによって送信された電子メールごとに、そのユーザーの名前とアドレスを返します。

SELECT name, address
FROM NESTED TABLES(users.emails ancestors(users))
WHERE size > 100 AND sender_address = email_address;

上の問合せでは、複数の「大きな」電子メールを送信したユーザーについて重複した結果が返されます。現在、SQL for Oracle NoSQL DatabaseではSELECT DINSTINCTがサポートされていないため、アプリケーションで重複削除を実行する必要があります。