Oracle CQLの問合せおよびビューを使用して、ストリームおよびリレーションからの要素データの選択、処理、フィルタ処理を行います。
QUERY文を使用して作成した最上位のSELECT文は問合せと呼ばれます。
VIEW文を使用して作成した最上位のVIEW文はビューと呼ばれます(Oracle CQLでの副問合せ)。
結合は、複数のストリーム、ビューまたはリレーションから行を結合する問合せです。
この章の内容は、次のとおりです。
詳細は、以下を参照してください。
Oracle CQL問合せは、Oracle CQL構文で表され、1つ以上のストリームまたはビューからのデータを取得するためにOracle CEP CQLプロセッサで実行される操作です。詳細は、17.2項「問合せ」を参照してください。
Oracle CQLビューは、ストリームまたはリレーションでの代替の選択項目を表します。Oracle CQLでは、副問合せのかわりにビューを使用します。詳細は、17.3項「ビュー」を参照してください
Oracle CEPでは、問合せのFROM句に複数のストリームがある場合は常に結合が行われます。詳細は、17.4項「結合」を参照してください。
例17-1は、procという名前のOracle CQLプロセッサ・コンポーネントの構成ファイルに定義された一般的なOracle CQL問合せを示します。
例17-1 一般的なOracle CQL問合せ
<?xml version="1.0" encoding="UTF-8"?>
<n1:config
xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd"
xmlns:n1="http://www.bea.com/ns/wlevs/config/application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<processor>
<name>proc</name>
<rules>
<view id="lastEvents" schema="cusip mbid srcId bidQty ask askQty seq"><![CDATA[
select cusip, mod(bid) as mbid, srcId, bidQty, ask, askQty, seq
from filteredStream[partition by srcId, cusip rows 1]
]]></view>
<query id="q1"><![CDATA[
SELECT *
FROM lastEvents [Range Unbounded]
WHERE price > 10000
]]></query>
</rules>
</processor>
</n1:config>
例17-1に示すように、rules要素の子要素viewまたはqueryには各Oracle CQL文が含まれています。
view: Oracle CQLのビュー(Oracle CQLでの副問合せ)の文が含まれます。view要素のid属性はビューの名前を定義します。
例17-1では、view要素で Oracle CQL view文(Oracle CQLでの副問合せ)が指定されています。
query: Oracle CQLのselect文が含まれます。query要素のid属性は問合せの名前を定義します。
例17-1では、query要素でOracle CQL問合せ文が指定されています。問合せ文ではビューからの選択が行われます。デフォルトでは、問合せの結果が下流のチャネルに出力されます。チャネルの構成でselector要素を使用して、この動作を制御できます。
詳細は、Eclipse用Oracle CEP開発者ガイドのOracle CEP IDE for Eclipseを使用してデフォルトのコンポーネント構成ファイルでチャネルを構成する方法に関する項を参照してください。
各Oracle CQL文は<![CDATA[ ... ]]>タグで囲み、末尾にセミコロン(;)は付けません。
詳細は、以下を参照してください。
一般に、Oracle CQLの問合せおよびビューは、Oracle CEP IDE for Eclipseを使用して作成します。デプロイメント後に、Oracle CEP Visualizerを使用してOracle CQLの問合せを追加、変更および削除できます。
Oracle CQL問合せを作成するには:
Oracle CEP IDE for Eclipseを使用して、Oracle CEPアプリケーションとイベント処理ネットワーク(EPN)を作成します。
詳細は、以下を参照してください。
Eclipse用Oracle CEP開発者ガイドのOracle CEP IDE for Eclipseプロジェクトに関する項。
Eclipse用Oracle CEP開発者ガイドのOracle CEP IDE for Eclipseとイベント処理ネットワークに関する項。
EPNエディタでOracle CQLプロセッサを右クリックし、「構成のソースに移動」を選択します(図17-1を参照)。
EPNエディタでこのプロセッサの対応するコンポーネント構成ファイルが開き、該当するprocessor要素にカーソルが置かれます(図17-2を参照)。
問合せとビューを作成し、ユーザー定義の関数とウィンドウを登録します。
例については、次の項を参照してください。
Oracle CEPスタート・ガイド
Oracle CEP IDE for Eclipseを使用して、Oracle CEPアプリケーションをパッケージ化し、Oracle CEPサーバーにデプロイします。
詳細は、Eclipse用Oracle CEP開発者ガイドのOracle CEPアプリケーションのアセンブルおよびデプロイに関する項を参照してください。
デプロイメント後、Oracle CEP Visualizerを使用してOracle CEPアプリケーションで問合せを変更、追加および削除します。
詳細は、Oracle CEP Visualizerユーザーズ・ガイドのOracle CQLルールの管理に関する項を参照してください。
問合せは、データ・ストリームおよびビューからの情報を抽出する主な手段です。

query句自体は、次のいずれかの部分で構成されます。
sfw_block: CQL問合せを表すには、このselect-from-where句を使用します。
詳細は、17.2.1.1項「Select、From、Whereブロック」を参照してください。
idstream_clause: 問合せに適用されるリレーションからストリームへの入力IStreamまたは削除DStream演算子を指定するには、この句を使用します。
詳細は、17.2.1.9項「IDStream Clause句」を参照してください。
rstream: 問合せに適用されるリレーションからストリームへのRStream演算子を指定するには、この句を使用します。
詳細は、「リレーションからストリームへのRStream演算子」を参照してください。
binary: 2つの問合せまたはビューで返されるタプルの集合演算を実行するには、この句を使用します。
詳細は、17.2.1.8項「Binary句」を参照してください。
次の項では、作成できる基本的な問合せの種類について説明しています。
詳細は、以下を参照してください。
この項では、Oracle CQL問合せの作成に使用する基本的な構成要素について概説します。
sfw_blockを使用して、Oracle CQL問合せの select、from、およびオプションのwhere句を指定します。

sfw_blockは次の部分で構成されます。
問合せの結果セットに必要なストリーム要素を指定するには、この句を使用します。select_clauseでは*演算子を使用してすべてのストリーム要素を指定するか、1つ以上のストリーム要素のリストを指定できます。

SELECTキーワードの後で、from_clauseの前に置かれた式のリストはselectリストと呼ばれます。selectリストでは、1つ以上のストリームまたはビューからOracle CEPによって返される要素のセットで1つ以上のストリーム要素を指定します。ストリーム要素の個数、データ型および長さはselectリストの要素によって決まります。
選択した重複タプルの各セットで1つのコピーのみが返されるようにするには、オプションでdistinctを指定します。重複タプルとはselectリスト内の各式と一致する値を持つタプルです。
詳細は、select_clause::=を参照してください。
select_clauseで指定されたストリーム要素を提供するストリームおよびビューを指定するには、この句を使用します(17.2.1項「Select句」を参照)。
from_clauseでは、1つ以上のカンマ区切りのrelation_variable句を指定できます。

詳細は、from_clause::=を参照してください。

relation_variable句で指定された任意のデータ・ソースから選択できます。
relation_variable句のAS演算子で別名を定義してselectリストの直前の式にラベルを付け、その名前で結果を参照できます(2.8.1.1項「relation_variable句の別名」を参照)。
共通するストリーム要素名を持つ複数のストリーム、ビューまたはリレーションで結合を作成する場合は(17.4項「結合」を参照)、各ストリーム、ビューまたはリレーションの名前を使用して、ストリーム要素名を修飾する必要があります。例17-2は、ストリーム名を使用して、OrderStreamのcustomerIDストリーム要素とCustomerStreamのcustomerIDストリーム要素を区別する方法を示します。
例17-2 完全修飾されたストリーム要素名
<query id="q0"><![CDATA[
select * from OrderStream, CustomerStream
where
OrderStream.customerID = CustomerStream.customerID
]]></query>
それ以外の場合、完全修飾されたストリーム要素名はオプションです。ただし、ストリーム名の参照を常に明示的に修飾することをお薦めします。完全修飾されたストリーム要素名によって、多くの場合Oracle CEPでの処理が軽減されます。
詳細は、以下を参照してください。
select_clauseで結果が返される条件を指定するには、このオプションの句を使用します(17.2.1.2項「Select句」を参照)。
Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。
詳細は、以下を参照してください。
結果をグループ化(分割)するには、このオプションの句を使用します。この句では、結果セットの順序は保証されません。グループ化を並べ替えるには、order by句を使用します。
Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。
詳細は、以下を参照してください。
すべての結果または上位n個の結果を並べ替えるには、このオプションの句を使用します。
詳細は、以下を参照してください。
返されたストリーム要素のグループを指定されたconditionがTRUEのグループに制限するには、このオプションの句を使用します。この句を省略すると、Oracle CEPではすべてのグループのサマリ結果が返されます。
Oracle CQLではWHERE句はGROUP BYまたはHAVINGの前に適用されるため、SELECT句で集計関数を指定する場合、WHERE句ではなくHAVING句で集計関数の結果をテストする必要があります。
詳細は、以下を参照してください。
2つの問合せまたはビューで返されるタプルで次の集合演算を実行するには、binary句を使用します。
EXCEPT
MINUS
INTERSECT
UNIONとUNION ALL
INとNOT IN
詳細は、binary::=を参照してください。
select-from-where句またはbinary句を使用し、その結果をIStreamまたはDStreamのいずれかのリレーションからストリームへの演算子として返すには、この句を使用します。
IStreamまたはDstream演算子とusing_clauseを組み合せることで、問合せ結果の差分を簡単に検出できます。
詳細は、以下を参照してください。
例17-3に、単一のストリームからすべてのストリーム要素を選択する単純な問合せを示します。
例17-3 単純な問合せ
<query id="q0"><![CDATA[
select * from OrderStream where orderAmount > 10000.0
]]></query>
詳細は、「Query」を参照してください。
例17-4に、組込みのタプルベースのストリームからリレーションへのウィンドウ演算子を使用して、スキーマ(c1 integer, c2 float)を持つストリームS2からすべてのストリーム要素を選択する問合せを示します。
例17-4 組込みウィンドウの問合せ
<query id="BBAQuery"><![CDATA[
create query q209 as select * from S2 [range 5 minutes] where S2.c1 > 10
]]></query>
詳細は、以下を参照してください。
例17-5に、ItemTempStreamのストリーム要素間の複雑な関係を表すMATCH_RECOGNIZE句を使用する問合せを示します。
例17-5 MATCH_RECOGNIZEの問合せ
<query id="detectPerish"><![CDATA[
select its.itemId
from tkrfid_ItemTempStream MATCH_RECOGNIZE (
PARTITION BY itemId
MEASURES A.itemId as itemId
PATTERN (A B* C)
DEFINE
A AS (A.temp >= 25),
B AS ((B.temp >= 25) and (to_timestamp(B.element_time) - to_timestamp(A.element_time) < INTERVAL "0 00:00:05.00" DAY TO SECOND)),
C AS (to_timestamp(C.element_time) - to_timestamp(A.element_time) >= INTERVAL "0 00:00:05.00" DAY TO SECOND)
) as its
]]></query>
詳細は、以下を参照してください。
Oracle CQLプロセッサを使用すると、リレーショナル・データベース表をイベント・ソースとして指定できます。このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合したりできます。
たとえば、例17-6に示すSQL文を使用して、アクセスする表を作成するとします。
構成後、通常のイベント・ストリームと同様に、Stock表にアクセスするOracle CQL問合せを定義できます。例17-7に、1つのイベント・ストリームExchangeStreamとStock表を結合する問合せを示します。
例17-7 リレーショナル・データベース表Stockに対するOracle CQL問合せ
SELECT ExchangeStream.symbol, ExchangeStream.price, Stock.exchange FROM ExchangeStream [Now], Stock WHERE ExchangeStream.symbol = Stock.symbol
Oracle CEPのリレーション・データベース表イベント・ソースはプル・データ・ソースです。つまり、Oracle CEPはイベント・ソースを定期的にポーリングします。
詳細は、以下を参照してください。
Oracle CEP管理者ガイドのリレーショナル・データベースへのアクセスの構成に関する項
Eclipse用Oracle CEP開発者ガイドのOracle CQLプロセッサ表ソースの構成に関する項
例17-8は、ビューv1と、そのビューに対する問合せq1を示します。ビューはxmltypeストリーム要素を持つストリームS1から選択します。ビューv1はXMLTABLE句でXPath式を使用して、xmltypeストリーム要素のデータを解析します。ビューのスキーマのデータ型は、COLUMNS句で解析されたデータのデータ型と一致します。問合せq1は他の任意のデータ・ソースの場合と同様に、このビューから選択します。XMLTABLE句はXMLネームスペースもサポートしています。
例17-8 XMLTABLEの問合せ
<view id="v1" schema="orderId LastShares LastPrice"><![CDATA[
select
X.OrderId,
X.LastShares,
X.LastPrice
from
S1
XMLTABLE (
"//FILL"
PASSING BY VALUE
S1.c1 as "."
COLUMNS
OrderId char(16) PATH "fn:data(../@ID)",
LastShares integer PATH "fn:data(@LastShares)",
LastPrice float PATH "fn:data(@LastPx)"
) as X
]]></view>
<query id="q1"><![CDATA[
IStream(
select
orderId,
sum(LastShares * LastPrice),
sum(LastShares * LastPrice) / sum(LastShares)
from
v1[now]
group by orderId
)
]]></query>
詳細は、以下を参照してください。
TABLE句を使用して、Oracle CQL問合せのFROM句内の組込みまたはユーザー定義関数から返された複数の行にアクセスします。TABLE句は返された複数の行をOracle CQLリレーションに変換します。これは外部リレーションであるため、TABLE句をストリームと結合する必要があります。

(object_expr::=、identifier::=、datatype::=)
次の点に注意してください。
関数は、配列型またはCollection型を返す必要があります。
TABLE関数の句とストリームを結合する必要があります。
例17-9は、1つのパラメータ(InputPoints.point)を渡して、Oracle Spatialデータ・カートリッジ・メソッドgetContainingGeometriesを呼び出すデータ・カートリッジTABLE句を示しています。このメソッドの戻り値Collectionには別名validGeometriesが作成されます。TABLE句が戻すリレーションには別名R2が作成されます。
例17-9 データ・カートリッジTABLEの問合せ
<query id="q1"><![CDATA[
RSTREAM (
SELECT
R2.validGeometries.shape as containingGeometry,
R1.point as inputPoint
FROM
InputPoints[now] as R1,
TABLE (getContainingGeometries@spatial (InputPoints.point) as validGeometries) AS R2
)
]]></query>
例17-10に、パラメータを指定せずに関数getAllGeometries@spatialを呼び出したために、データ・カートリッジTABLE句と別のストリームとの結合に失敗した、無効なデータ・カートリッジTABLEの問合せを示します。Oracle CEPでは、結合ストリームに要素が到着したときにのみデータ・カートリッジ・メソッドを呼び出します。
例17-10 無効なデータ・カートリッジTABLEの問合せ
<query id="q2"><![CDATA[
RSTREAM (
SELECT
R2.validGeometries.shape as containingGeometry
FROM
TABLE (getAllGeometries@spatial () as validGeometries) AS R2
)
]]></query>
その他の例については、次の項を参照してください。
詳細は、以下を参照してください。
Oracle CQLプロセッサを使用すると、キャッシュをイベント・ソースとして指定できます。Nowウィンドウを使用する場合にのみ、このイベント・ソースで問合せを実行したり、他のイベント・ソースと結合できます。
Oracle CEPのキャッシュ・イベント・ソースはプル・データ・ソースです。つまり、Oracle CEPはイベント・ソースを定期的にポーリングします。
詳細は、17.5項「Oracle CQL問合せとOracle CEPサーバー・キャッシュ」を参照してください。
問合せで選択された行を並べ替えるには、ORDER BY句を使用します。

DIFFERENCE USING句を使用すると、問合せのIStreamまたはDStreamの差分を簡単に検出できます。

例17-11のような問合せがあるとします。
例17-11 DIFFERENCE USING句
<query id="q0">
ISTREAM (
SELECT c1 FROM S [RANGE 1 NANOSECONDS]
) DIFFERENCE USING (c1)
</query>
表17-1に、この問合せのサンプル入力を示します。リレーション列にはリレーションS [RANGE 1 NANOSECONDS]の内容を示し、出力列にはDIFFERENCE USINGを適用後の問合せ結果を示します。この句を使用すると、IStream出力の差分のみを簡単に検出できます。
表17-1 DIFFERENCE USING句のIStreamへの作用
| 入力 | リレーション | 出力 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DIFFERENCE USING句でusinglistを指定する場合、次の項目で列を指定できます。
属性名: 属性名で選択する場合に、このオプションを使用します。
例17-12は、DIFFERENCE USING句のusinglistの属性名c1を示しています。
別名: 別名が指定されている式の結果を含める場合に、このオプションを使用します。
例17-12は、DIFFERENCE USING句のusinglistの別名logvalを示しています。
位置: 別名が指定されていない式の結果を含める場合に、このオプションを使用します。
位置は、左から右に読み取る、1で始まる正の整数の、定数として指定します。
例17-12では、位置(3)によって、DIFFERENCE USING句のusinglistの式の結果funct(c2, c3)を示しています。
例17-12 DIFFERENCE USING句でのusinglistの指定
<query id="q1">
ISTREAM (
SELECT c1, log(c4) as logval, funct(c2, c3) FROM S [RANGE 1 NANOSECONDS]
) DIFFERENCE USING (c1, logval, 3)
</query>
DIFFERENCE USING句は、IStream演算子とDStream演算子の両方で使用できます。
詳細は、以下を参照してください。
問合せは、データ・ストリームおよびリレーションからの情報を抽出する主な手段です。ビューは、ストリームまたはリレーションでの代替の選択項目を表し、副問合せの作成に使用できます。
ビューは、同じプロセッサにある問合せからのみアクセス可能で、この範囲を越えて公開することはできません。
ビューの定義で、任意の問合せタイプを指定できます。詳細は、17.2項「問合せ」を参照してください。
view文の詳細は、「View」を参照してください。
例17-13では、問合せBBAQueryはビューMAXBIDMINASKからの選択を行い、このビューはBIDMAXなどの他のビューからの選択を行い、それらのビューはさらに他のビューからの選択を行います。最終的に、lastEventsなどのビューが実際のイベント・ソースであるfilteredStreamからの選択を行います。これらの各ビューは、1つ以上の基本ストリームから派生した個別のストリームを表しています。
例17-13 副問合せのかわりとしてのビューの使用
<view id="lastEvents" schema="cusip bid srcId bidQty ask askQty seq"><![CDATA[
select cusip, bid, srcId, bidQty, ask, askQty, seq
from filteredStream[partition by srcId, cusip rows 1]
]]></view>
<view id="bidask" schema="cusip bid ask"><![CDATA[
select cusip, max(bid), min(ask)
from lastEvents
group by cusip
]]></view>
<view id="bid" schema="cusip bid seq"><![CDATA[
select ba.cusip as cusip, ba.bid as bid, e.seq
from bidask as ba, lastEvents as e
WHERE e.cusip = ba.cusip AND e.bid = ba.bid
]]></view>
<view id="bid1" schema="cusip maxseq"><![CDATA[
select b.cusip, max(seq) as maxseq
from bid as b
group by b.cusip
]]></view>
<view id="BIDMAX" schema="cusip seq srcId bid bidQty"><![CDATA[
select e.cusip, e.seq, e.srcId, e.bid, e.bidQty
from bid1 as b, lastEvents as e
where (e.seq = b.maxseq)
]]></view>
<view id="ask" schema="cusip ask seq"><![CDATA[
select ba.cusip as cusip, ba.ask as ask, e.seq
from bidask as ba, lastEvents as e
WHERE e.cusip = ba.cusip AND e.ask = ba.ask
]]></view>
<view id="ask1" schema="cusip maxseq"><![CDATA[
select a.cusip, max(seq) as maxseq
from ask as a
group by a.cusip
]]></view>
<view id="ASKMIN" schema="cusip seq srcId ask askQty"><![CDATA[
select e.cusip, e.seq, e.srcId, e.ask, e.askQty
from ask1 as a, lastEvents as e
where (e.seq = a.maxseq)
]]></view>
<view id="MAXBIDMINASK" schema="cusip bidseq bidSrcId bid askseq askSrcId ask bidQty askQty"><![CDATA[
select bid.cusip, bid.seq, bid.srcId as bidSrcId, bid.bid, ask.seq, ask.srcId as askSrcId, ask.ask, bid.bidQty, ask.askQty
from BIDMAX as bid, ASKMIN as ask
where bid.cusip = ask.cusip
]]></view>
<query id="BBAQuery"><![CDATA[
ISTREAM(select bba.cusip, bba.bidseq, bba.bidSrcId, bba.bid, bba.askseq, bba.askSrcId, bba.ask, bba.bidQty, bba.askQty, "BBAStrategy" as intermediateStrategy, p.seq as correlationId, 1 as priority
from MAXBIDMINASK as bba, filteredStream[rows 1] as p where bba.cusip = p.cusip)
]]></query>
この方法を使用して、副問合せと同様の結果を得ることができます。ただし、ビューを使用することで、問合せの複雑さをより柔軟に制御でき、名前によって他の問合せでビューを再利用できます。
共通するストリーム要素名を持つ複数のビューで結合を作成する場合は、ストリームの名前を使用してストリーム要素名を修飾する必要があります。例17-14は、ビュー名を使用して、BIDMAXビューのseqストリーム要素とASKMINビューのseqストリーム要素を区別する方法を示します。
例17-14 ビュー名を使用した同名のストリーム要素の区別
<view id="MAXBIDMINASK" schema="cusip bidseq bidSrcId bid askseq askSrcId ask bidQty askQty"><![CDATA[
select bid.cusip, bid.seq, bid.srcId as bidSrcId, bid.bid, ask.seq, ask.srcId as askSrcId, ask.ask, bid.bidQty, ask.askQty
from BIDMAX as bid, ASKMIN as ask
where bid.cusip = ask.cusip
]]></view>
それ以外の場合、完全修飾されたストリーム要素名はオプションです。ただし、ストリーム要素は常に明示的に参照することをお薦めします。完全修飾されたストリーム要素名によって、多くの場合Oracle CEPでの処理が軽減されます。
詳細は、17.4項「結合」を参照してください。
結合とは、複数のストリーム、ビューまたはリレーションからの行を結合する問合せです。Oracle CEPでは、問合せのFROM句に複数のストリームがある場合は常に結合が行われます。問合せのselectリストでは、それらの任意のストリームから任意のストリーム要素を選択できます。いずれか2つのストリームで共通するストリーム要素名がある場合は、ストリーム名を使用して、問合せ全体を通じてそれらのストリーム要素に対するすべての参照を修飾し、曖昧さを避ける必要があります。
共通するストリーム要素名を持つ複数のストリーム、ビューまたはリレーションで結合を作成する場合は、各ストリーム、ビューまたはリレーションの名前を使用して、ストリーム要素名を修飾する必要があります。例17-16は、ストリーム名を使用して、OrderStreamストリームのcustomerIDストリーム要素と CustomerStreamストリームのcustomerIDストリーム要素を区別する方法を示します。
例17-16 完全修飾されたストリーム要素名
<query id="q0"><![CDATA[
select * from OrderStream[range 5] as orders, CustomerStream[range 3] as customers where
orders.customerID = customers.customerID
]]></query>
それ以外の場合、完全修飾されたストリーム要素名はオプションです。ただし、ストリーム名の参照を常に明示的に修飾することをお薦めします。完全修飾されたストリーム要素名によって、多くの場合Oracle CEPでの処理が軽減されます。
Oracle CEPでは、次の種類の結合がサポートされています。
デフォルトでは、Oracle CEPは内部結合(単純結合とも呼ばれる)を実行します。これは、複数のストリームから結合条件を満たすストリーム要素のみを返す結合です。
例17-17は、スキーマ(c1 integer, c2 float)を持つストリームS0とスキーマ(c1 integer, c2 float)を持つストリームS1の間の内部結合を使用する問合せq4を作成する方法を示します。
外部結合は、単純結合の結果を拡張します。外部結合では、結合条件を満たすすべての行に加えて、他の表に結合条件を満たす行が含まれていなくても表の一部またはすべての行が返されます。
外部結合は、LEFTまたはRIGHT OUTER JOIN ... ON構文を使用して、問合せのFROMで指定します。

(non_mt_relation_list::=、relation_variable::=、non_mt_cond_list::=)
例17-18は、スキーマ(c1 integer, c2 float)を持つストリームS0とスキーマ(c1 integer, c2 float)を持つストリームS1の間の左外部結合を使用する問合せq5を作成する方法を示します。
例17-18 外部結合
<query id="q5"><![CDATA[
SELECT a.c1+b.c1
FROM S0[range 5] AS a LEFT OUTER JOIN S1[range 3] AS b ON b.c2 = a.c2
WHERE b.c2 > 3
]]></query>
ON句を使用して結合条件を指定します。これにより、WHERE句の検索条件またはフィルタ条件とは別個に結合条件を指定できます。
次の種類の外部結合を実行できます。
ストリームAおよびBの外部結合を実行し、Aのすべてのストリーム要素を返す(左外部結合の)問合せを作成するには、例17-19に示すように、FROM句でLEFT OUTER JOIN構文を使用します。Bに一致するストリーム要素がないAのすべてのストリーム要素については、Oracle CEPによってBのストリーム要素を含むselectリスト式でnullが返されます。
ストリームAおよびBの外部結合を実行し、Bのすべてのストリーム要素を返す(右外部結合の)問合せを作成するには、例17-20に示すように、FROM句でRIGHT OUTER JOIN構文を使用します。Aに一致するストリーム要素がないBのすべてのストリーム要素については、Oracle CEPによってAのストリーム要素を含むselectリスト式でnullが返されます。
前の外部結合を参照する、または見直す外部結合を作成できます(例17-21を参照)。
Oracle CQL文またはユーザー定義関数からOracle CEPキャッシュにアクセスできます。
この項の内容は、次のとおりです。
詳細は、以下を参照してください。
Eclipse用Oracle CEP開発者ガイドのOracle CEPのキャッシュの構成に関する項
Eclipse用Oracle CEP開発者ガイドのOracle CQL文からのキャッシュへのアクセスに関する項
Eclipse用Oracle CEP開発者ガイドのOracle CQLユーザー定義関数からのキャッシュへのアクセスに関する項
Oracle CEPスタート・ガイドのOracle Continuous Query Language(CQL)の例に関する項
キャッシュに対して結合を行うOracle CQL問合せを作成する場合、次の制限に従う必要があります。
詳細は、17.4項「結合」を参照してください。
キャッシュ・キー属性に対する比較演算を持つ複合述語の(左から)1番目の副句には、単純な同値述語しか使用できません。
述語がキャッシュ属性を参照する(左から)1番目の副句ではないため、次の述語は無効です。
... S.c1 = 5 AND CACHE.C2 = S.C2 AND CACHE.C1 = S.C1 ...
しかし、次の述語は有効です。
... S.c1 = 5 AND CACHE.C1 = S.C1 AND CACHE.C2 = S.C2 ...
副句で、キャッシュ・キー属性に対する算術演算は使用できません。
キャッシュ・キー属性では算術演算を使用できないため、次の述語は無効です。
... CACHE.C1 + 5 = S.C1 AND CACHE.C2 = S.C2 ...
複合述語で、キャッシュの全体スキャンは使用できません。
キャッシュのキャッシュ・キーがC1であるとします。
次の述語は無効です。比較でキャッシュ・キー属性が使用されておらず、キャッシュ全体のスキャンが必要ですが、全体スキャンは許可されていないためです。
... CACHE.C2 = S.C1 ... ... CACHE.C2 > S.C1 ... ... S.C1 = S.C2 ... ... S.C1 = CACHE.C2 AND S.C2 = CACHE.C2 ...
次の述語も無効です。比較でキャッシュ・キー属性が使用されていますが、キャッシュ全体のスキャンが必要な非等値演算が使用されており、全体スキャンは許可されていないためです。
... CACHE.C1 != S.C1 ... ... CACHE.C1 > 5 ... ... CACHE.C1 + 5 = S.C1 ...
次の述語も無効です。比較でキャッシュ・キー属性が使用されていますが、キャッシュ属性を参照している最初の副句がキャッシュ・キー属性(この例ではC1)を参照していません。すなわち、最初の副句はキャッシュ・キーではないC2を参照しており、キャッシュ・キー比較副句(CACHE.C1 = S.C1)が非キー比較副句の後に置かれています。
... CACHE.C2 = S.C2 AND CACHE.C1 = S.C1 ...
リレーショナル・データベース表には、Oracle CQL文からアクセスできます。
リレーショナル・データベース表に対して結合を行う問合せについて、Oracle CQLはすべての種類の複合述語をサポートしています。
詳細は、Eclipse用Oracle CEP開発者ガイドのOracle CQLプロセッサ表ソースの構成に関する項を参照してください。