13

これが繰り返されないことを願っています。検索を確認しましたが、これに対する明確な答えが見つからないようです。

主キーが に設定されているテーブルがありますUniqueIdentifiervarcharまた、最初のテーブルの GUID を含むクエリ文字列を含む URL を基本的に含む列を 持つ別のテーブルもあります。

だから私の2つのテーブルは次のようになります:

状態テーブル

StateID                                  StateName
EB06F84C-15B9-4397-98AD-4A63DA2A238E     Active

URL テーブル

URL
page.aspx?id=EB06F84C-15B9-4397-98AD-4A63DA2A238E

私がやろうとしているのは、一緒に結合しURLTableStateTableON の値がStateIDURL テーブルの URL に含まれていることです。私は本当に結合を理解していません。1 つのテーブルを選択するだけで、 の値でフィルタリングしようとしましたStateTable。私はこのようなことを試みました:

SELECT  *
FROM URLTable
WHERE     EXISTS
    (SELECT  *
     FROM  StateTable
     WHERE URL LIKE '%' + StateID + '%')

それは私が比較していると言っているので、それでもうまくいきませuniqueidentifiervarchar

like コマンドを使用して 2 つのテーブルを結合する方法はありますか? like コマンドが 2 つの互換性のない変数を比較していませんか?

ありがとうございました!!

更新: 私が言及すべきいくつかの追加事項を追加させてください。クエリは、分析レポートを作成するためのものです。テーブルは CMS 分析パッケージの一部であるため、テーブル構造を更新または変更することはできません。

第二に、これらのテーブルはサイト分析をキャプチャしているため、非常に大量のトラフィックが表示されるため、パフォーマンスが非常に問題になります。3 つ目は、私の例では id= と言いましたが、 のように複数の値が存在する可能性があることid=guid&user=guid&date=dateです。

更新 2: 恐ろしいことに気付いたもう 1 つのことは、クエリ文字列で GUID からダッシュが削除されている場合とそうでない場合があることですUniqueidentifier。私はそれを使用して動作するようになりまし

REPLACE('-','',CONVERT(varchar(50), a.AutomationStateId))

しかし、URL のテーブルが非常に大きいため、パフォーマンスの問題が非常に心配です。これが獣の性なのかもしれませんが、私にできることがない限りは。

4

4 に答える 4

18

StateID を互換性のある型にキャストします。

WHERE URL LIKE '%' + CONVERT(varchar(50), StateID) + '%'

また

WHERE URL LIKE N'%' + CONVERT(nvarchar(50), StateID) + N'%'

URL が nvarchar(...) の場合

編集

別の回答で指摘されているように、これにより、大きなテーブルでパフォーマンスが低下する可能性があります。LIKE を CONVERT と組み合わせると、テーブル スキャンが実行されます。これは小さなテーブルでは問題にならないかもしれませんが、パフォーマンスが問題になる場合は、URL を 2 つの列に分割することを検討する必要があります。1 つの列には「page.aspx?id=」が含まれ、もう 1 つの列には UNIQUEIDENTIFIER が含まれます。その後、クエリをより簡単に最適化できます。

于 2012-04-04T21:35:40.070 に答える
5

=は常にそこにあり、常に であることを知っていますかUNIQUEIDENTIFIER。次に、これを行うことができます:

WHERE CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID

編集

コメントの一部として、JOIN. このような:

select 
   u.* 
from 
   urltable
join statetable s 
   on CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID
于 2012-04-04T21:42:03.560 に答える
4
select u.* from urltable
join statetable s on url like N'%' + (convert(varchar(50),s.stateid) + N'%'

パフォーマンスはひどいものになる可能性があります

于 2012-04-04T21:43:53.557 に答える
0

最初に一時テーブルを作成し、一時テーブルにインデックスを付けるオプションを使用すると、パフォーマンスが向上する場合があります。次に、(一時テーブルの) スキーマを変更して、結合のオプションを提供することもできます。多くの場合、BIG テーブルに結合する場合、最初にデータのサブセットを一時テーブルに抽出してから、それに結合すると役立ちます。また、一時テーブルのオーバーヘッドが「醜い」結合を使用するよりも大きい場合もあります

于 2014-04-08T06:30:12.053 に答える