2

以下で説明するように、tableAとtableBの2つのテーブルがあります

desc tableA
GUID
PROPERTY_NAME
PROPERY_VALUE
ANOTHER_COL_1
ANTHER_COL_2

desc tableB
GUID
PROPERY_NAME
PROPERTY_VALUE
RANDOM_COL_1
RANDOME_COL_2

ここでは「URL」である property_name に一致する値を持つエントリのリストを取得する次のクエリがあります

SELECT A.GUID as SOURCE_GUID, 
       B.GUID as DESTINATION_GUID 
FROM
       tableA A,
       tableB B
WHERE
       A.PROPERTY_NAME = "URL" AND
       A.PROPERY_NAME  = B.PROPERTY_NAME AND
       A.PROPERTY_VALUE = B.PROPERTY_VALUE

ここでの問題は、プロパティ値が URL であるため、末尾にスラッシュがある場合とない場合があることです。末尾のスラッシュに関係なく、結合が発生するようにします。PL/SQLプロシージャを使用して末尾のスラッシュを削除せずに、同じことを達成するより良い方法を提案してください。

4

3 に答える 3

7

2 つのオプションがあります。

1 つ目は、使用前にデータを消去することです。

システムに URL を保存する前に、必要に応じてスラッシュを追加または削除します (必要に応じて)。このようにして、すべての URL が使いやすいように同じ形式で保存されていることを確認してください。

2 つ目は、実行時にデータを消去することです。

これらのオプションは不要なオーバーヘッドを引き起こし、インデックスの最適な使用を妨げる可能性があるため、推奨しません。

RTRIM(A.PROPERTY_VALUE, '/') = RTRIM(B.PROPERTY_VALUE, '/')

最もクリーンなコードですが、インデックスの使用を妨げる可能性があります。

  • テーブル A とテーブル B の両方の値が変更されています
  • これには、両方のテーブルで SCAN が必要になる可能性があります

または...

  • (B.PROPERTY_VALUE が「/」で終わっていることを確認してから、比較を行います); また
  • (B.PROPERTY_VALUE が「/」で終わっていないことを確認してから、比較を行います)

これらの条件のいずれかが true の場合、URL は一致します。

A.PROPERTY_VALUE = (CASE WHEN RIGHT(B.PROPERTY_VALUE, 1) = '/' THEN B.PROPERTY_VALUE ELSE B.PROPERTY_VALUE + '/' END)
OR
A.PROPERTY_VALUE = (CASE WHEN RIGHT(B.PROPERTY_VALUE, 1) = '/' THEN RTRIM(B.PROPERTY_VALUE, '/') ELSE B.PROPERTY_VALUE END)

はるかに厄介ですが、よりインデックスに適している可能性があります

  • B テーブルの値のみが変更されています
  • BのSCANが必要です
  • A での INDEX SEEK が可能になりました
于 2011-11-29T10:07:45.803 に答える
3

RTRIM 関数を使用して、末尾のスラッシュを簡単に削除できます。

...
AND RTRIM(A.PROPERTY_VALUE,'/') = RTRIM(B.PROPERTY_VALUE,'/')
于 2011-11-29T10:06:46.380 に答える
3
SELECT A.GUID as SOURCE_GUID, 
       B.GUID as DESTINATION_GUID 
FROM   tableA A,
       tableB B
WHERE  A.PROPERTY_NAME = "URL"
AND    A.PROPERY_NAME = B.PROPERTY_NAME
AND    RTRIM(A.PROPERTY_VALUE, '/') = RTRIM(B.PROPERTY_VALUE, '/')
于 2011-11-29T10:07:12.687 に答える