【发布时间】:2009-04-03 22:06:29
【问题描述】:
我正在尝试从 2 个单独的表创建一个 ANI 查找表,一个是商店表,另一个是这些商店的联系人列表。
我使用的是 MS SQL Server 2005,不幸的是,它不支持 MERGE INTO 语法...
好东西: ANI 查找表有 2 个重要的列,StoreID 和 PhoneNumber。 PhoneNumber 列是(唯一的)主键,因为给定的 PhoneNumber 必须只返回一个 StoreID。
Store_Info 重要列:
StoreID
StorePhone
AltPhone
每个 StoreID 都有一个记录,商店之间的电话号码可能重复。是的,AltPhone 可能与 StorePhone 相同...
Store_Contacts 重要列:
StoreID
Phone
StoreID 有多个条目,一个商店或多个商店的电话号码可能重复。
商店数据示例
StoreID Parent ID StorePhone AltPhone
1 0 402-123-2300 402-123-2345
2 0 202-321-7800 202-321-7890
3 1 202-302-5600 202-302-5600
联系人数据示例:
StoreID Title Name Phone
1 Mgr Bob 402-123-2345
1 IT Pat 402-123-2346
1 Reg Mgr Dave 402-321-3213
2 Mgr Ann 202-231-7890
2 IT Mary 202-231-7893
2 A/R Ann 202-231-7890
2 Reg Mgr Dave 402-321-3213
3 Mgr Bob 402-123-2345
3 AsstMgr Pete 402-123-2356
我想按以下优先级插入电话号码:
- 主/单店StorePhone
- 主/单店 AltPhone
- 分店StorePhone
- AltPhone 分店
- 主/单店联系电话
- 分店联系电话
- 如果目标表中已存在电话号码,请勿添加...
所以结果数据集应该是:
StoreID Phone
1 402-123-2300 (first pass)
2 202-321-7800
1 402-123-2345 (2nd pass)
2 202-321-7890
3 202-302-5600 (3rd & 4th pass - only add once)
1 402-123-2346 (5th pass - skip dup)
1 402-321-3213
2 202-231-7893 (do not add dups)
3 402-123-2356 (final pass - skip dup)
我优先选择要选择的重复电话号码的方法是根据其他条件(例如,主商店与分店)进行多次查询,将找到的第一个条目插入 ANI 查找表并跳过后续重复。
如何在不使用 RBAR 的情况下做到这一点?我尝试了以下方法,但没有成功 - 实际上,它可以正常工作,直到我到达 Store_Contacts 表,其中给定商店可能有多个相同的电话号码:
INSERT INTO dbo.Store_PhoneNumbers (StoreID, PhoneNumber)
SELECT DISTINCT StoreID, dbo.GetPhoneNumber10(StorePhone)
FROM dbo.Store_Info
WHERE dbo.IsAniNumber(dbo.GetPhoneNumber10(StorePhone)) = 1
AND ParentID = 0
AND NOT EXISTS (SELECT * FROM dbo.Store_PhoneNumbers WHERE PhoneNumber = dbo.GetPhonenumber10(StorePhone));
... 重复 AltPhone,然后 StorePhone where ParentID 0 然后 AltPhone w/ ParentID 0
到目前为止一切都很好,那么这里就是分崩离析的地方:
INSERT INTO dbo.Store_PhoneNumbers (StoreID, PhoneNumber)
SELECT DISTINCT sc.StoreID, dbo.GetPhoneNumber10(sc.Phone)
FROM Store_Contacts sc
INNER JOIN
Store_Info si ON sc.StoreID = si.StoreID
WHERE (dbo.IsAniNumber(dbo.GetPhoneNumber10(sc.Phone)) = 1)
AND (si.ParentID = 0)
AND NOT EXISTS (SELECT * FROM dbo.Store_PhoneNumbers WHERE PhoneNumber = dbo.GetPhonenumber10(sc.Phone));
... 并重复 ParentID 0
这就是我得到重复条目并且插入失败的地方。
感谢您能给我的任何帮助,我即将放弃并使用光标,只是为了完成它...
戴夫
【问题讨论】:
-
您能否添加您用于确定电话号码优先级的确切逻辑?我不确定我是否理解为什么 AltPhone 会包含在 ANI 表中。
-
您可能希望提供两个表中的一些示例数据,然后提供您期望从解决方案查询中获得的结果。
-
ANI = 自动号码识别 RBAR = 逐行逐行
-
不知道你的排名标准很难给出一个好的答案
-
感谢您清理格式,Ben!
标签: sql