我根据另一个表中的JOIN运行UPDATE语句,以识别并添加正确的'目的地'代码
以下是我的代码。
UPDATE [BILLING]
SET [BILLING].[BILLDESTINATION] = [Orbisrates].[dbo].[RATES].[DESTINATION]
FROM [OrbisRates].[dbo].[RATES]
INNER JOIN [OrbisBilling].[dbo].[BILLING]
ON [OrbisBilling].[dbo].[BILLING].[TO] LIKE
[RATES].[DESTINATION] + ''%''
我在很大程度上认为匹配不正确。
以下是我的目的地列表中的示例代码
1
100
1001
问题是电话号码1001999返回100作为目的地,因为我需要它来匹配最长的正确匹配,所以我希望它返回1001。
匹配最长/最佳匹配的正确语法是什么?
非常感谢任何帮助。
编辑 - 此处的完整代码
DECLARE @tablevalue NVARCHAR(MAX), @sql NVARCHAR(MAX);
DECLARE table_value_cursor CURSOR FOR
SELECT DISTINCT [Tariff Lookup]
FROM [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325]; OPEN table_value_cursor
FETCH NEXT FROM table_value_cursor INTO @tablevalue WHILE @@FETCH_STATUS = 0
BEGIN SELECT @sql = N'
UPDATE [masked_2014-06-30-2014-06-01-customer325]
SET [masked_2014-06-30-2014-06-01-customer325].[Sell Price] =
(CASE WHEN (DATEPART(hh,[OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ConnectTime]) >= 8 AND DATEPART(hh,[OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ConnectTime]) <= 17)
THEN ROUND ([Orbisrates].[dbo].[Orbis_Import_June2014].[Peakperminute]/60*[OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ChargedTimeSecs]+[Orbisrates].[dbo].[Orbis_Import_June2014].[Peakconnect],4)
ELSE ROUND ([Orbisrates].[dbo].[Orbis_Import_June2014].[OffPeakperminute]/60*[OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[ChargedTimeSecs]+[Orbisrates].[dbo].[Orbis_Import_June2014].[OffPeakconnect],4)
END)
FROM [OrbisRates].[dbo].'+ @tablevalue +'
INNER JOIN [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325] on [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[To] LIKE '+ @tablevalue +'.[Destination]+ ''%''
WHERE [OrbisBilling].[dbo].[masked_2014-06-30-2014-06-01-customer325].[tariff lookup] = '''+ @tablevalue +'''';
EXEC sp_executesql @sql;
FETCH NEXT FROM table_value_cursor
INTO @tablevalue;
END CLOSE table_value_cursor
DEALLOCATE table_value_cursor;
答案 0 :(得分:2)
以下是用别名重写的查询,因此更容易阅读(至少对我而言):
UPDATE b
SET BillDestination = r.Destination
FROM OrbisRates.dbo.Rates r INNER JOIN
OrbisBilling.dbo.Billing b
on b.[To] LIKE r.Destination + '%';
您遇到的问题是多次匹配。解决此问题的一种方法是使用子查询:
UPDATE b
SET BillDestination = (SELECT TOP 1 r.Destination
FROM OrbisRates.dbo.Rates r
WHERE b.[To] LIKE r.Destination + '%'
ORDER BY LEN(r.Destination) DESC
)
FROM OrbisBilling.dbo.Billing b;