我有一些看起来像这样的数据: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经验。任何帮助表示赞赏。
答案 0 :(得分:0)
您可以使用public int search(String element) {
Obj x = new Obj(element, "");
int index = Collections.binarySearch(pairs, x);
获取匹配对的第一行。然后使用ROW_NUMBER
从第二对中获取替换值。
APPLY