2017-05-03 5 views
3

私はクエリをスピードアップする効果的な方法を探しています。状況を説明しましょう。SQL Server - VARCHARとINTの間で結合するより良い方法

毎晩、さまざまなベンダーのレポートをテーブルにダンプします。これらは多くの列ですが、これらの列はクエリに参加するために使用する主な列です。

tblVendorShippingInfo(時にはQtyShippedでvarchar型の文字が含まれている報告以来、以下のすべての論文の列がVARCHARであることに注意してください)

PONum  vSKU vSKUDesc  ShipQuantity 
P111111 A  Test1  5 
P111111 A  Test1  2 
P111111 B  Test3  5 
P100002 C  Test4  6 
P222222 D  Test5  7 
P222222 D  Test5  6 
P222222 E  Test6  7 
PABC123 F  Test7  8 
XYZ123 G  Test8  8 
GHEHEH H  Test9  8 

tblPODetail - 私たちのテーブル発注のため。 POIDとDistyShippedQtyは整数であることに注意してください。 POIDは6桁の数字です。

POID  SKU  SKUDesc  DistyShippedQty 
111111 A  Test1  
111111 B  Test3  
100002 C  Test4  
222222 D  Test5  
222222 E  Test6   

私はDistyShippedQtyを取得し、更新するには、以下のようなクエリを使用している場合、それは動作しますが、遅い変換... VARCHARマッチング...等ため。

select POID, SKU 
, (
    SELECT SUM(ShipQuantity) AS ShipQuantity 
    FROM tblVendorShippingInfo 
    WHERE substring(PONum, 2, 6) = Convert(varchar(10), pod.POID) 
    AND vSKU = pod.SKU 
    ) AS QtyCount 
FROM tblPODetail pod 

だから、私はちょうど、唯一の6桁が(P後、または任意の文字)第二の位置で始まるれるPONumを持ってtblVendorShippingInfoテーブル内のレコードをフィルタする(文字を持つすべてのレコードを無視するより良い方法を探しています例:PABC123、XYZ123、GHEHEH)、tblPODetailテーブルとの結合に使用できるようにインデックスを付けます。

フィルタを使用してインデックス付きビューを作成しようとしましたが、このビューでクエリを実行すると失敗しました。

Alter VIEW vw_tblVendorShippingInfo WITH SCHEMABINDING AS 
select dfID, substring(PONum,2, 6) AS POID 
, vSKU, ShipQuantity 
FROM dbo.tblVendorShippingInfo 
WHERE 1 = 1 
AND PONum like '%[^0-9]%' 

推奨事項はあります。

+0

あなたは 'WHERE'節の変更としてこれを取り除くことができ、特に遅くなることはありません:' WHERE PONum LIKE CONCAT( '_'、pod.POID) '。この方法でPONumの部分文字列に参加する必要はなく、PONumとPOIDにあるインデックスを使用できるはずです。 – ZLK

+0

私はそれを試して、エラーが発生しました "'CONCAT'は認識された組み込み関数名ではありません。私はSQL Server 2008 – Milacay

+0

Hmを使用しています。 'LIKE '_' + CAST(pod.POID AS VARCHAR(10))'はCONCATと同じように動作します。問題は変換ではなく、PONumの部分文字列に結合しているという事実です。それでもまだ遅い場合は、ビューの解決策が最適かもしれません。 – ZLK

答えて

2

あなたは正しい軌道にいると思います。あなただけのlikeのために右の式を必要とする:

SELECT POID, SKU, 
     (SELECT SUM(ShipQuantity) AS ShipQuantity 
     FROM tblVendorShippingInfo vsi 
     WHERE substring(vsi.PONum, 2, 6) = Convert(varchar(10), pod.POID) AND 
       vSKU = pod.SKU 
     ) as QtyCount 
FROM tblPODetail pod 
WHERE PONum like '[A-Za-z][0-9][0-9][0-9][0-9][0-9][0-9]'; 

あなたは整数としてインデックスこれにしたい場合は、計算列を使用します。

alter table tblVendorShippingInfo add column POID_num as try_convert(int, substring(PONum, 2, 6); 

create index idx_tblVendorShippingInfo_POID on tblVendorShippingInfo(POID_num); 

try_convert()は、SQL Serverの2012+を前提としています。以前のバージョンのSQL Serverと同様のことができます。

+0

私はあなたが解決策は最高だと思うが、私はまだ解明するのに苦労している。最初の正しい表現については、2〜7桁目の文字だけをLIKEにすることができますが、文字(A〜Z)が含まれていれば何も含めることはできません。たとえば、 "P123455、Z334545H、9222222KK"のような文字列の場合、6桁のレコードを取得しますが、2-7の位置に文字が含まれているため、 "AB12345689,12345Z6"のような文字列は無視します。ありがとうございます – Milacay

+0

私はまた、計算カラムについての2番目のソリューションが好きですが、まだそれを把握することはできません。 SQL Server 2008を使用していますが、try_convert()オプションを使用していないため、上記の条件の計算列操作が可能です。2-7の位置から6桁しか含まず、すべての文字(A-Z)を無視しますか? – Milacay

+0

このように計算された列を作成しようとしましたが、作業していませんでした ""テーブルを変更するtblVendorShippingInfo POIDを(サブリング(PONum、2、6)NOT%LIKE '%[^ 0-9]%') "" – Milacay

0

オラクル(およびその他の場合)の場合は、仮想/計算列でインデックスを指定できます。

また、夜間のアップロード時に列を追加して1回入力することもできます。

関連する問題