我正在处理两个表 - 一个用于地址,另一个用于MasterAddressCodes。基于另一个表上的值更新表的SQL集操作
我需要使用地址的位置代码更新地址表,因为它在MasterAddressCodes表中。
这已经是使用游标编写的脚本,但效率非常低,需要2个多小时才能完成(约225000条记录),而且我知道必须有更优雅和高性能的解决方案。
下面是表的详细信息:
地址:
CREATE TABLE [dbo].[Address](
[addressID] [int] IDENTITY(1,1) NOT NULL,
[number] [varchar](12) NULL,
[street] [varchar](30) NULL,
[tag] [varchar](20) NULL,
[prefix] [varchar](10) NULL,
[apt] [varchar](17) NULL,
[city] [varchar](24) NULL,
[state] [varchar](2) NULL,
[zip] [varchar](10) NULL,
[location_code] [varchar](40) NULL,
[postOfficeBox] [bit] NOT NULL,
)
MasterAddressCode:
CREATE TABLE [dbo].[MasterAddressCode](
[Street Name] [varchar](50) NULL,
[From] [varchar](50) NULL,
[To] [varchar](50) NULL,
[Code] [varchar](50) NULL,
[LocationCode] [varchar](50) NULL,
[Tag] [varchar](10) NULL,
[Prefix] [varchar](10) NULL
)
这是我到目前为止有:
select locationcode from MasterAddressCode tmp
join address a on a.street = tmp.[street name], a.prefix = tmp.prefix, a.tag = tmp.tag
where a.number between tmp.[from] and tmp.[to]
这里是哪里我是st科军。地址[号码]列的值与您所期望的一样 - 123,4567,8899988 - 但也有例外,如123 1/2,345 1/3,678 1/4。
此外,与MasterAddressCode的匹配还取决于数字是偶数还是奇数 - 但不是所有地址,只有那些在MasterAddressCode中具有偶数或'O'奇数的'E'的数字。 [code]栏。
光标脚本执行以下操作:
-- Iterate through all records in address
-- if location code does not match what is in MasterAddressCode, update the location code
DECLARE @addID INT
DECLARE @street varchar (30)
DECLARE @tag VARCHAR(20)
DECLARE @prefix VARCHAR(10)
DECLARE @number VARCHAR(12)
DECLARE @num INT
DECLARE @recCt INT
DECLARE @newLocCode VARCHAR(40)
DECLARE add_cursor CURSOR FOR
select addressid from address
OPEN add_cursor
FETCH NEXT from add_cursor into @addID
WHILE @@FETCH_STATUS = 0
BEGIN
Print @addID;
set @street = (select street from address where addressid = @addID)
set @tag = (select tag from address where addressid = @addID)
set @number = (select number from address where addressid = @addID)
set @prefix = (select prefix from address where addressid = @addID)
--cast number as int and remove 1/2 if there
IF @number like ('%1/2') or @number like ('%1/3')or @number like ('%1/4')
BEGIN
set @number = LEFT(@number, LEN(@number) - 3)
END
set @recCt = (select count(*) from MasterAddressCode where [Street Name] = @street
and tag = @tag
and prefix = @prefix
and (@num between [From] and [To]))
--check for the street to be 'odd'
IF @recCt > 1 and (@num%2)<>0 and (@street is not NULL or @street != '') and (@number is not NULL)
BEGIN
set @newLocCode = (SELECT LocationCode FROM MasterAddressCode
WHERE (@num between [From] and [To])
AND [Street Name] = @street
AND tag = @tag
AND Code = 'O')
PRINT 'Odd ' + @number + ' ' + @newLocCode
END
--check for the street to be 'even'
IF @recCt > 1 and (@num%2)=0 and (@street is not NULL or @street != '') and (@number is not NULL)
BEGIN
set @newLocCode = (SELECT LocationCode FROM MasterAddressCode
WHERE (@num between [From] and [To])
AND [Street Name] = @street
AND tag = @tag
AND Code = 'E')
PRINT 'Even ' + @number + ' ' + @newLocCode
END
--default update
IF @recCt = 1 and (@street is not NULL or @street != '') and (@number is not NULL)
BEGIN
set @newLocCode = (SELECT LocationCode FROM MasterAddressCode
WHERE (@num between [From] and [To])
AND [Street Name] = @street
AND tag = @tag
AND Code = '' or Code is NULL)
PRINT 'Default ' + @number + ' ' + @newLocCode
END --else
IF @street is NULL or @number is NULL
BEGIN
set @newLocCode = NULL
PRINT 'NULL in number or street'
END
update address set location_code = @newLocCode where addressid = @addID
FETCH NEXT FROM add_cursor INTO @addID
END --while
CLOSE add_cursor
DEALLOCATE add_cursor
所以...任何建议,将不胜感激!
其中'@ num'正在填充脚本中? –