5.11.1 属性検索

ここでは,属性検索(プロパティを指定した検索)でのedmSQLの指定例を示します。

<この項の構成>
(1) 指定例で使用するクラスとプロパティ
(2) 一つのクラスに対して実行する属性検索
(3) 結合したクラスに対して実行する属性検索
(4) 副問い合わせを実行する属性検索
(5) 検索結果を取得する順序を指定した属性検索
(6) 基本単位がVariableArray型のプロパティを指定した属性検索
(7) 集合関数を指定した属性検索

(1) 指定例で使用するクラスとプロパティ

この指定例で検索の対象になる文書は,次のようなクラスから作成された文書です。

文書X
Document Xクラスを基に作成された文書です。ユーザ定義プロパティとして,次の表に示すプロパティが設定されています。

表5-39 Document Xクラスのプロパティ

プロパティ名内容
DocCode文書を管理するためのコード
Titleタイトル
Author著者
AuthorId著者ID
Abstract概要
CreateDate作成日
所有者一覧
OwnersListクラスを基に作成された文書です。ユーザ定義プロパティとして,次の表に示すプロパティが設定されています。

表5-40 OwnersListクラスのプロパティ

プロパティ名内容
DocCode文書を管理するためのコード
Owner所有者
辞書Y
Dictionary Yクラスを基に作成された文書です。ユーザ定義プロパティとして,次の表に示すプロパティが設定されています。

表5-41 Dictionary Yクラスのプロパティ

プロパティ名内容
Name名前
Birthday誕生日
EntryIdエントリーID
論文
myPaperクラスを基に作成された文書です。次の表に示すプロパティが設定されています。

表5-42 myPaperクラスのプロパティ

プロパティ名内容
Titleタイトル
AuthorsName名前
Org所属

注※ 基本単位がVariableArray型のプロパティです。


(2) 一つのクラスに対して実行する属性検索

ここでは,一つのクラスに対して実行する属性検索の指定例を示します。

(a) SELECT句とFROM句だけを指定する検索

<検索対象>としてDocument Xクラスを,<選択項目>としてTitleプロパティ,AuthorプロパティおよびAbstractプロパティを取得する例を示します。

指定例

SELECT Title,Author,Abstract
FROM   "Document X"

(b) SELECT句,FROM句およびWHERE句を指定する検索

(a)に加えて,検索条件としてWHERE句に「Authorプロパティが『日立太郎』で,CreateDateプロパティが20000101以上」という条件を指定する例を示します。

指定例

SELECT Title,Author,Abstract
FROM "Document X"
WHERE Author = '日立太郎' AND CreateDate > '20000101'

(c) 重複排除を指定する検索

Document Xクラスから,Authorプロパティを,重複を排除して取得する例を示します。

指定例

SELECT DISTINCT Author
FROM "Document X"

(d) 検索条件としてOIIDを指定した検索

Document Xクラスから作成された文書から,OIIDを指定して,Titleプロパティ,AuthorプロパティおよびAbstractプロパティを取得する例を示します。なお,OIIDは,oiid関数を使用して指定します。

指定例

SELECT Title,Author,Abstract
FROM "Document X"
WHERE dmaProp_OIID = oiid('dma:///xxx/xxx/xxxxxxxxxx...xxx')

(3) 結合したクラスに対して実行する属性検索

ここでは,複数のクラスを結合した検索対象クラスに対して実行する属性検索の指定例を示します。

なお,edmSQLで実行できる結合の方法には,次の2種類があります。

それぞれの場合の指定例を示します。

(a) 二つのクラスを内部結合した検索

Document XクラスとOwnersListクラスを内部結合して,Document Xクラスの文書のTitleプロパティ,Document XクラスのAuthorプロパティおよびOwnersListクラスのOwnerプロパティを取得する例を示します。ここでは,次の二つの方法の指定例を示します。

結合では,Document XクラスのDocCodeプロパティとOwnersListクラスのDocCodeプロパティが一致することを条件とします。

なお,Document Xクラスの<相関名>としてDX,OwnersListクラスの<相関名>としてOLを使用します。

FROM句に<クラス指定>を並べて内部結合して,結合の条件をWHERE句に指定する方法
次のように指定します。
指定例

SELECT DX.Title,DX.Author,OL.Owner
FROM "Document X" DX, OwnersList OL
WHERE DX.DocCode = OL.DocCode

INNER JOINを使用して二つのクラスの結合を指定する検索
次のように指定します。
指定例

SELECT DX.Title,DX.Author,OL.Owner
FROM   "Document X" DX INNER JOIN OwnersList OL
          ON DX.DocCode = OL.DocCode

(b) 三つのクラスを内部結合した検索

Document Xクラス,OwnersListクラスおよびDictionary Yクラスを結合して,Document XクラスのTitleプロパティとDocument XクラスのAuthorプロパティ,Dictionary YクラスのBirthdayプロパティおよびOwnersListクラスのOwnerプロパティを取得する例を示します。ここでは,次の二つの方法の指定例を示します。

結合では,Document XクラスのDocCodeプロパティとOwnersListクラスのDocCodeプロパティが一致することと,Document XクラスのAuthorIdプロパティとDictionary YクラスのEntryIdプロパティが一致することを条件とします。

FROM句に<クラス指定>を並べて内部結合して,結合の条件をWHERE句に指定する方法
次のように指定します。
指定例

SELECT DX.Title,DX.Author,DY.Birthday,OL.Owner
FROM  "Document X" DX,
            OwnersList OL,"Dictionary Y" DY
WHERE  DX.DocCode = OL.DocCode
AND DX.AuthorId = DY.EntryId

INNER JOINを使用して三つのクラスの結合を指定する検索
次のように指定します。
指定例

SELECT DX.Title,DX.Author,DY.Birthday,OL.Owner
FROM ("Document X" HD INNER JOIN OwnersList OL
ON DX.DocCode = OL.DocCode)
INNER JOIN "Dictionary Y" DY
 ON DX.AuthorId = DY.EntryId

(c) 二つのクラスを外部結合した検索

Document XクラスとOwnersListクラスを外部結合して,Document Xクラスの文書のTitleプロパティとDocument XクラスのAuthorプロパティおよびOwnersListクラスのTitleプロパティを取得する例を示します。

次のように指定します。

指定例

SELECT DX.Title,DX.Author,OL.Owner
FROM "Document X" DX LEFT OUTER JOIN OwnersList OL
       ON DX.DocCode = OL.DocCode

(d) 三つのクラスを外部結合した検索

Document Xクラス,OwnersListクラスおよびDictionary Yクラスを外部結合して,Document XクラスのTitleプロパティ,Document XクラスのAuthorプロパティ,Dictionary YクラスのBirthdayプロパティおよびOwnersListクラスのOwnerプロパティを取得する例を示します。

指定例

SELECT DX.Title,DX.Author,DY.Birthday,OL.Owner
FROM ("Document X" DX LEFT OUTER JOIN OwnersList OL
   ON DX.DocCode = OL.DocCode) LEFT OUTER JOIN
 "Dictionary Y" DY ON DX.AuthorId = DY.EntryId

(4) 副問い合わせを実行する属性検索

ここでは,副問い合わせを指定する場合の属性検索の指定例を示します。

(a) 比較述語を指定した副問い合わせ

OIIDがわかっているDocument XクラスのオブジェクトのCreateDateプロパティよりも,Birthdayプロパティが新しい(値が大きい)Dictionary Yクラスのオブジェクトの,NameプロパティとBirthdayプロパティを取得する例を示します。

指定例

SELECT Name, Birthday
FROM "Dictionary Y"
WHERE  Birthday > (SELECT CreateDate
       FROM "Document X"
       WHERE dmaProp_OIID =
              oiid( 'dma:///xxx/xxx/xxxxxxxxxx...xxx'))

(b) In述語を指定した副問い合わせ

CreateDateプロパティが19990101よりも値が大きいDocument XクラスのオブジェクトのAuthorIdプロパティのどれかと,EntryIdプロパティの値が等しい,Document Xクラスの オブジェクトのNameプロパティとBirthdayプロパティを取得する例を示します。

指定例

SELECT Name, Birthday
FROM "Dictionary Y"
WHERE EntryId IN (SELECT AuthorId
                     FROM "Document X"
                     WHERE CreateDate < '19990101')

(c) Exists述語を指定した副問い合わせ

DictionaryクラスのオブジェクトのNameプロパティとDocument XクラスのオブジェクトのAuthorプロパティが一致する文書が一つでもあれば,そのDictionary Yクラスの文書のNameプロパティとBirthdayプロパティを取得する例を示します。

指定例

SELECT Name, Birthday
FROM "Dictionary Y" DY
WHERE EXISTS (SELECT *
                  FROM "Document X" DX
                  WHERE DY.Name = DX.Author)

(5) 検索結果を取得する順序を指定した属性検索

ここでは,取得する検索結果の順序を指定する場合の属性検索の指定例を示します。

Document Xクラスの文書のうち,CreateDateプロパティの値が20000101よりも大きいオブジェクトを検索して,Titleプロパティ,Authorプロパティ,およびCreateDateプロパティを取得します。なお,この例では,Authorプロパティによって昇順に並べ替え,その中でCreateDateプロパティで降順に並べ替えて検索結果を取得します。まず,並べ替えのキーとしてソート項目指定番号を指定する例を示します。ソート項目番号は,AuthorプロパティはSELECT句で2番目に指定されているので「2」,CreateDateプロパティはSELECT句で3番目に指定されているので「3」になります。

指定例

SELECT Title,Author,CreateDate
FROM "Document X"
WHERE CreateDate > '20000101'
ORDER BY 2 ASC,3 DESC

これを,プロパティ名で指定すると,次のようになります。

指定例

SELECT Title,Author,CreateDate
FROM "Document X"
WHERE CreateDate > '20000101'
ORDER BY Author ASC,CreateDate DESC

(6) 基本単位がVariableArray型のプロパティを指定した属性検索

ここでは,基本単位がVariableArray型のプロパティの検索方法について説明します。

(a) 基本単位がVariableArray型のプロパティを取得する検索

ここでは,myPaperクラスの基本単位がVariableArray型のプロパティであるAuthorsプロパティを取得する例を示します。

指定例

SELECT Title,Authors
FROM myPaper
WHERE CreateDate > '20000101'

(b) 基本単位がVariableArray型のプロパティの要素の値を指定した検索

ここでは,myPaperクラスの基本単位がVariableArray型のプロパティであるAuthorsプロパティの,Orgプロパティが「日立製作所」であるオブジェクトのTitleプロパティとAuthorsプロパティを取得します。

指定例

SELECT Title,Authors
FROM myPaper
WHERE Authors[ANY].Org = '日立製作所'

(7) 集合関数を指定した属性検索

ここでは,COUNT(*)関数およびCOUNT関数を使用した検索の指定例を示します。

Document Xクラスの文書のうち,作成日が「2000年1月1日」よりも新しい(CreateDateプロパティの値が「20000101」よりも大きい)文書の数を取得します。

指定例

SELECT COUNT(*) FROM "Document X"
WHERE CreateDate > '20000101'

次に,Document Xクラスの文書のうち,作成日が「2000年1月1日」よりも新しい(CreateDateプロパティの値が「20000101」よりも大きい)文書のAuthorsプロパティの値の数を,重複排除して取得します。

指定例

SELECT COUNT(DISTINCT Authors) FROM "Document X"
WHERE CreateDate > '20000101'