我正在寻找加快查询的有效方法。让我描述情况。
每天晚上,我们将不同供应商报告的报告中。这些是很多列,但是下面的这些列是我在查询中加入的主要列。
tblvendorshippingInfo(请注意,下面的所有论文列都是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和DistyphippingQty是整数。Poid只有6位数字。
POID SKU SKUDesc DistyShippedQty
111111 A Test1
111111 B Test3
100002 C Test4
222222 D Test5
222222 E Test6
如果我在下面使用这样的查询来获取和更新distyphpysqty,则它会起作用,但由于转换...匹配的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
所以,我正在寻找一种更好的方法来过滤tblvendorshippinginfo表中的记录,该记录只有Ponum,其中只有6位数字,从2个位置开始(P之后或任何char之后(,请忽略所有记录,例如Chars(例如PABC123,XYZ123,XYZ123,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]%'
任何建议都将不胜感激。
我认为您在正确的轨道上。您只需要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的早期版本进行类似的操作。
如果是oracle(也许是其他(,则可以在列上的虚拟/计算上指定索引。
或者在每晚上传期间添加一列并将其填充一次。