DISTINCTとGROUP BY
DISTINCTが意味的にGROUP BYと同じである場合、最適化ルーチンはコストを基準にして判断し、ソート組み合わせと重複排除によって、または集約ステップによって重複を排除します。
DISTINCT演算子およびUDT
DISTINCT演算子を指定し、SELECT列リストにUDT列が含まれている場合、DISTINCT処理を実行するためにTeradata DatabaseはそのUDTの順序付け機能を適用します。
順序付け定義によっては、同じ問合わせでも異なる結果を返す可能性があります。これは、大文字と小文字を区別して文字列に対するDISTINCT処理を行なった結果が異なることと同様です。そのような問合わせを二度発行すると、異なる結果が返される可能性があります。
UDTの例については、以下の属性で構成される、CircleUdtという構造化UDTを考えてください。
- x INTEGER
- y INTEGER
- r INTEGER
CircleUdtの外部タイプが、ASCII形式のx、y、およびr構成要素を含む文字列であるとします。順序付け機能は、2つのCircleUdtインスタンスのr構成要素をマップおよび比較するように定義されています。
次の円のr値は両方とも9であるため、これらの円は等しいと考えられます。
- NEW CircleUdt('1,1,9'), where x=1, y=1, and r=9
- NEW CircleUdt('6,10,9')
システムは、DISTINCT結果セットの一部として、「1,1,9」を返すこともあれば、「6,10,9」を返すこともあります。
DISTINCTおよびラージ オブジェクト
DISTINCTも指定する場合、SELECTリクエストの選択リストにLOB列を含めることはできません。
次のテーブルに示されるように、LOB列を適切なデータ型にCASTする場合は、DISTINCTとともにそれらを指定することができますです。
LOB列にこのデータ型がある場合 | このデータ型にCASTした場合にはDISTINCTで参照できる |
---|---|
BLOB |
|
CLOB |
|
DISTINCT演算子と利用できないSQL要素
以下のSQL要素は、DISTINCT演算子も指定するリクエストとともに指定することはできません。
- WITHリクエスト修飾子
- TOP n演算子
- 再帰的問合わせの再帰文
しかし、再帰的問合わせに含まれる非再帰的シード文では、DISTINCTを指定できます。
DISTINCT演算子での予期しない行長エラー
重複を除去するのに必要なソート操作を実行する前に、Teradata Databaseはソート キーを作成して、ソートする行に付加します。その一時データ構造の長さがシステム上の行長制約の64 KBを超えると、その操作は失敗し、エラーが返されます。状況に応じて、エラー メッセージのテキストは以下のようになります。
- データ行が長すぎます。
- database_object_nameの最大行長を超えました。
これらのメッセージについては、<Teradata Vantage™ - データベース メッセージ、B035-1096>を参照してください。
BYNETは、指定のフィールドをソートするために作成されたソート キーの最初の4,096バイトしか見ません。従って、ソート キーの基準になる列が4,096バイトより大きいと、そのキーは切り捨てられてしまい、集合内の行は、固有であっても重複として識別されたり、重複であっても固有として識別されます。