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プロセッサ表ソースの構成に関する項を参照してください。