从同一个表的另一个更新一行的某些列

时间:2017-02-05 21:11:33

标签: sql-server sql-server-2005

我有一些看起来像这样的数据:http://sqlfiddle.com/#!6/21a06/1

id   step   valA   valB   valC
------------------------------
100  1      NULL   2      3
101  2      4      5      6
102  3      7      NULL   9
103  3      10     11     12
104  4      13     14     15
105  4      NULL   14     15
106  5      NULL   18     19
107  5      20     18     19

id是一个唯一的字段。我正在尝试提出一个查询,该查询将更新下一行的某些列(在此示例中为valA和valB)中给定行的值。只有当两行的'step'匹配时(预计不会有超过两行匹配),如果第一行中列valA或valB的值为NULL(具有较低的listid值),则该值的值相同将下一行中的列复制到第一行。

因此,在上面给出的表示例中,id = 102的行应该将valB更新为11(以匹配id = 103的下一行的valB)。此外,id = 106的行应将valA更新为20(以匹配id = 107的下一行的valA)。任何给定的行对可以同时满足valA和valB的条件(均为NULL)。 id = 100 row不受影响,因为没有其他行使用step = 1,并且也没有触及id = 105 row,因为NULL位于'step'对的第二行。

结果如下:

id   step   valA   valB   valC
------------------------------
100  1      NULL   2      3
101  2      4      5      6
102  3      7      11     9
103  3      10     11     12
104  4      13     14     15
105  4      NULL   14     15
106  5      20     18     19
107  5      20     18     19

如果它更容易,id = 105行的NULL也可以更新为id = 104 row(13)的值,但这不是必需的。

我发现了一些看似相关的问题,我尝试了各种内部连接等等,但却无法提出任何有效的方法。这超出了我的基本SQL经验。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您可以使用public int search(String element) { Obj x = new Obj(element, ""); int index = Collections.binarySearch(pairs, x); 获取匹配对的第一行。然后使用ROW_NUMBER从第二对中获取替换值。

APPLY

ONLINE DEMO

相关问题