Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-使用行号来参考索引值更新联系人id的复杂查询_Sql Server - Fatal编程技术网

Sql server SQL Server-使用行号来参考索引值更新联系人id的复杂查询

Sql server SQL Server-使用行号来参考索引值更新联系人id的复杂查询,sql-server,Sql Server,以前的开发人员使用索引而不是实际的contactID来引用哪些关联联系人是主要联系人。当应用程序获取联系人并在页面列表中设置主要联系人时,索引工作正常,但请尝试加入以获取报告!不容易;因此,我想用实际的联系人ID更新主表,以实现简单的连接并避免这种错误 在这种情况下,我需要使用索赔人ContactId和agentContactID更新tblInquiry。我刚刚创建的这两个字段默认为0。然而,挑战在于使用tblInquiry中的索赔人联系人索引和代理联系人索引值,从tblContacts中获取相

以前的开发人员使用索引而不是实际的contactID来引用哪些关联联系人是主要联系人。当应用程序获取联系人并在页面列表中设置主要联系人时,索引工作正常,但请尝试加入以获取报告!不容易;因此,我想用实际的联系人ID更新主表,以实现简单的连接并避免这种错误

在这种情况下,我需要使用索赔人ContactId和agentContactID更新
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