SQL Server - 在VARCHAR和INT之间加入的更好方法

时间:2017-05-03 00:15:31

标签: sql sql-server

我正在寻找加快查询速度的有效方法。让我来描述一下情况。

每天晚上,我们将来自不同供应商的报告转储到表格中。这些是很多列,但下面的这些列是我用于加入查询的主要列。

tblVendorShippingInfo(请注意,下面的所有这些列都是VARCHAR,因为有时报告甚至在QtyShipped中包含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是Integer。 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 

所以,我正在寻找一种更好的方法来只过滤tblVendorShippingInfo表中的记录,该表只有PONum,从第2位开始有6位数(在P或任何字符之后),忽略所有带字符的记录(例如,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]%'

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分: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执行类似的操作。

答案 1 :(得分:0)

如果是Oracle(可能还有其他人),您可以按列指定虚拟/计算的索引。

或者,在每晚上传期间添加一列并填充一次。