Sql server SQL Server-使用行号来参考索引值更新联系人id的复杂查询
以前的开发人员使用索引而不是实际的contactID来引用哪些关联联系人是主要联系人。当应用程序获取联系人并在页面列表中设置主要联系人时,索引工作正常,但请尝试加入以获取报告!不容易;因此,我想用实际的联系人ID更新主表,以实现简单的连接并避免这种错误 在这种情况下,我需要使用索赔人ContactId和agentContactID更新Sql server SQL Server-使用行号来参考索引值更新联系人id的复杂查询,sql-server,Sql Server,以前的开发人员使用索引而不是实际的contactID来引用哪些关联联系人是主要联系人。当应用程序获取联系人并在页面列表中设置主要联系人时,索引工作正常,但请尝试加入以获取报告!不容易;因此,我想用实际的联系人ID更新主表,以实现简单的连接并避免这种错误 在这种情况下,我需要使用索赔人ContactId和agentContactID更新tblInquiry。我刚刚创建的这两个字段默认为0。然而,挑战在于使用tblInquiry中的索赔人联系人索引和代理联系人索引值,从tblContacts中获取相
tblInquiry
。我刚刚创建的这两个字段默认为0。然而,挑战在于使用tblInquiry
中的索赔人联系人索引和代理联系人索引值,从tblContacts
中获取相应的第n行。索引是基于0的,因此如果索引值为2,则获取第三个联系人的ID,例如
此外,ClaimentContactIndex和agentContactIndex可以为NULL,也可以为一些数字。如果为空,则假定第一个联系人(索引0)
我还要补充一点,联系人索引上不能有order by,因为应用程序在获取联系人列表时依赖于自然顺序(存储过程中没有order by),然后相应地选择索引 数据库平台:SQLServer2008R2快速版 我有以下表格结构: 特布林奇里
id | claimantID | agentID | claimantContactIndex | agentContactIndex | claimantContactID | agentContactID
--------------------------------
1 | 1001 | 2001 | 2 | 0 | 0 | 0
2 | 1002 | NULL | 0 | NULL | 0 | 0
tblClaimant
id | name | address | phone | email
--------------------------------
1001 | Widgets Inc. | 123 W. Main | 5550000 | widgets@here.com
1002 | Thingies LLC. | 456 W. Main | 5551111 | thingies@here.com
tblAgent
id | name | address | phone | email
--------------------------------
2001 | Simon Bros. | 789 W. Main | 5552222 | simon@here.com
TBL合同
id | claimantID | agentID | fn | ln | phone | email
--------------------------------
3001 | 1001 | NULL | John | Doe | 5553333 | john@here.com
3002 | 1001 | NULL | Fred | Flynn | 5554444 | fred@here.com
3003 | 1001 | NULL | Mike | Brown | 55555555 | mike@here.com
3004 | 1001 | NULL | Susan | Pierce | 5556666 | susan@here.com
3005 | NULL | 2001 | Jeff | Bridges | 5557777 | jeff@here.com
3006 | NULL | 2001 | Karry | Sinclair | 5558888 | Karry@here.com
3007 | NULL | 2001 | Steve | Green | 5559999 | steve@here.com
3008 | NULL | 2001 | Peter | White | 5550001 | peter@here.com
更新:我已经解决了这个解决方案的选择部分,现在我可以使用ROW_NUMBER()和JOIN获得正确的索赔人联系信息。我将添加更多以获得正确的代理联系信息。我还处理了索引为NULL的情况。最终,我会解决这个问题,更新查询表,现在我有了正确的联系人ID
SELECT
i.id inquiryID, i.claimantContactIndex, i.agentContactIndex, i.claimantContactID, i.agentContactID
,r.id contactID, r.claimantID, r.agentID
,r.*
FROM
(
SELECT ROW_NUMBER()
OVER (Partition by con.claimantid Order by (SELECT NULL)) AS RowNumber, *
FROM tblContacts con
) r
INNER JOIN
tblInquiry i on i.claimantid = r.claimantid and ((isnull(i.claimantContactIndex, 0) + 1 = r.RowNumber ))
WHERE
i.id in (1, 2, 3, 4, 5)
ORDER BY
i.id
你可以这样做: 使用此处的想法:
获取基于索引的结果集。我会将其放入临时表中,并从其中选择RowNumber=您想要的任何索引。通过执行以下操作解决了此问题:
- 正如我在上面发布的,使用ROW_NUMBER()和(SELECT NULL())以及isnull来处理NULL值以获得正确的联系人
- 我将结果选择到临时表中
- 然后,我通过将查询表连接到临时表来更新查询表
- 下降温度表
Thx@EricH为我指明了正确的方向。是的,我继承了这个可爱的应用程序,以及所有的缺点……正如你所看到的,我正在努力纠正这个糟糕的设计决策。我将更新80000多条查询记录……我还将补充一点,联系人索引上不能有orderby,因为应用程序在返回联系人列表时依赖于自然顺序,并相应地选择索引。我认为使用(orderby(selectnull))可以实现……哎呀,祝你好运。我相信你在顺序上是对的,关于:保持行顺序。我假设ID上有一个PK(除非我错了),默认排序顺序。
SELECT
ROW_NUMBER() OVER (Order by Id) AS RowNumber,
claimantID, agentID, (etc...)
FROM
tblContacts