查找具有匹配员工地址的供应商:ORACLE SQL
我这样做是为了根据地址和zipcode字段中的数字找到与我们的员工地址匹配的供应商,但是速度非常慢。查询将删除所有文本,并将employee表中的数字连接到vendor表 有什么方法可以提高查询性能查找具有匹配员工地址的供应商:ORACLE SQL,sql,oracle,match,vendor,Sql,Oracle,Match,Vendor,我这样做是为了根据地址和zipcode字段中的数字找到与我们的员工地址匹配的供应商,但是速度非常慢。查询将删除所有文本,并将employee表中的数字连接到vendor表 有什么方法可以提高查询性能 SELECT T1.EMPLID, T1.NAME, T1.ADDRESS1, T1.ADDRESS2, T1.ADDRESS3, T1.ADDRESS4, T1.CITY, T2.VENDOR_ID, T3.NAME1, T2.ADDRESS1, T2.ADDRESS2, T2.ADD
SELECT
T1.EMPLID, T1.NAME, T1.ADDRESS1, T1.ADDRESS2, T1.ADDRESS3, T1.ADDRESS4, T1.CITY,
T2.VENDOR_ID, T3.NAME1, T2.ADDRESS1, T2.ADDRESS2, T2.ADDRESS3, T2.ADDRESS4, T2.CITY
FROM PS_PERSONAL_DATA T1
JOIN PS_VENDOR_ADDR T2
ON
TRANSLATE(T1.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
SUBSTR(T2.POSTAL,0,5) =
TRANSLATE(T2.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T2.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
SUBSTR(T2.POSTAL,0,5)
JOIN PS_VENDOR T3
ON T2.VENDOR_ID = T3.VENDOR_ID
WHERE T1.EMPLID <> T2.VENDOR_ID
AND
TRANSLATE(T1.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
SUBSTR(T2.POSTAL,0,5) NOT LIKE ' '
AND T2.VENDOR_ID IN
(
SELECT VENDOR_ID
FROM PS_VOUCHER
WHERE PROCESS_INSTANCE <> 0
AND POST_STATUS_AP LIKE 'P'
AND VENDOR_ID NOT IN
(
'0000003730',
'0000003318',
'0000003555',
'0000002422',
'0000003458',
'0000001089',
'0000001450',
'0000003809',
'0000003255',
'0000001903'
)
HAVING SUM(GROSS_AMT) > 5000 AND COUNT(VENDOR_ID) > 2
GROUP BY VENDOR_ID
)
;
我会考虑以下方法: -通过添加两个计算列以及格式化结果来取消表的规范化 -在这些列上添加非主索引 然后,您可以在这些列上创建一个连接,该连接将运行得更快。解决了这个问题: 我的zipcode使用了错误的表T2而不是T1 我将供应商ID条件移到子查询之外 它现在在不到8秒内执行
SELECT
T1.EMPLID, T1.NAME, T1.ADDRESS1 AS EE_ADDR, T2.ADDRESS1 AS VEN_ADDR, T1.ADDRESS2, T1.ADDRESS3, T1.CITY, T1.POSTAL,
T2.VENDOR_ID, T2.ADDRESS1, T2.ADDRESS2, T2.ADDRESS3, T2.CITY, T2.POSTAL
FROM PS_PERSONAL_DATA T1
JOIN PS_VENDOR_ADDR T2
ON
TRANSLATE(T1.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS3, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS4, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
SUBSTR(T1.POSTAL,0,5) =
TRANSLATE(T2.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T2.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T2.ADDRESS3, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T2.ADDRESS4, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
SUBSTR(T2.POSTAL,0,5)
WHERE
TRANSLATE(T1.ADDRESS1, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS2, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS3, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
TRANSLATE(T1.ADDRESS4, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-#./ ,',' ') ||
SUBSTR(T1.POSTAL,0,5) NOT LIKE ' '
AND VENDOR_ID NOT IN
(
'0000003730',
'0000003318',
'0000003555',
'0000002422',
'0000003458',
'0000001089',
'0000001450',
'0000003809',
'0000003255',
'0000001903'
)
AND VENDOR_ID NOT LIKE 'SF%'
AND VENDOR_ID NOT LIKE 'P%'
AND VENDOR_ID NOT LIKE '_______'
AND T2.VENDOR_ID IN
(
SELECT VENDOR_ID
FROM PS_VOUCHER
WHERE PROCESS_INSTANCE 0
AND POST_STATUS_AP LIKE 'P'
HAVING SUM(GROSS_AMT) > 5000 AND COUNT(VENDOR_ID) > 2
GROUP BY VENDOR_ID
)
;
我只有选择访问权限…:我无法创建/更新/删除表。不过谢谢。想想看,我几乎一碰到这个问题就发现了这个问题。。。我可以让你少受40-50分钟的痛苦?正在搜索您发布时我是否看到了它:英雄联盟谢谢你,安德烈:D