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



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

每天晚上,我们将不同供应商报告的报告中。这些是很多列,但是下面的这些列是我在查询中加入的主要列。

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(也许是其他(,则可以在列上的虚拟/计算上指定索引。

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

最新更新