【问题标题】:SQL. Repair counter row by updateSQL。通过更新修复计数器行
【发布时间】:2015-04-19 18:11:24
【问题描述】:

也许它是重复的或 / 并且可能解决方案非常简单,但我找不到任何答案或更好的说法来写下正确的搜索查询。

假设我有下表

 ----------------------
| parent | child | pos |
 ----------------------
|   0    |    1  |  0  |
|   0    |    5  |  1  |
|   0    |    3  |  5  |
|   1    |    8  |  0  |
|   1    |    9  |  0  |
|   1    |    7  |  0  |
|   2    |    8  |  3  |
|   2    |    9  |  4  |
 ----------------------

如您所见,pos 行有点损坏。例如,对于父 0 及其子,pos 值为 0,1,5 而不是 0,1,2。对于父 1 及其子,它们也是 0,0,0 而不是 0,1,2

child 和 pos 背后绝对没有逻辑。我只是将它们随机化以表明 pos 不依赖于孩子,但孩子的顺序由其 pos 值定义。如果之前有订单,应该是一样的。

现在的问题是:是否可以使用更新 sql 语句“修复”这个 pos 行,即 pos 将是完整的并且始终从 0 开始?

我正在为 oracle、mysql 和 ms sql server 寻找一种或多种解决方案。这是因为我们正在与他们三个一起工作。

这就是希望的结果应该是这样的

 ----------------------
| parent | child | pos |
 ----------------------
|   0    |    1  |  0  |
|   0    |    5  |  1  |
|   0    |    3  |  2  |
|   1    |    8  |  0  |
|   1    |    9  |  1  |
|   1    |    7  |  2  |
|   2    |    8  |  0  |
|   2    |    9  |  1  |
 ----------------------

提前谢谢你。

附言。 A.D. for mysql的解决方案对我有用

【问题讨论】:

  • 您想要哪个数据库的答案?为什么不喜欢 DB2、Sybase、SQLite、Postgres 或 mSQL?最好只选一个。
  • 请用您正在使用的正确数据库标记您的问题。为什么需要在三个截然不同的数据库中解决这个问题?
  • 最好将问题缩小到单个数据库并为数据库添加一个 sqlfiddle 以及到目前为止您尝试过的内容。
  • 恕我直言,对我来说,您的“pos 行是如何损坏的”并不明显。您能否更具体地说明它们应该如何填写?
  • pos 值和child 值背后的逻辑是什么,我们了解parent and pos 之间的关系逻辑,但是child 呢? I mean which child should be 0, 1 or 2!? 还是没关系!?

标签: mysql sql sql-server oracle


【解决方案1】:

我有这个mysql解决方案

UPDATE your_table
, (
    SELECT parent
    , child
    , @num := IF(@parent = parent, @num + 1, 0) AS rownum
    , @parent := parent
    FROM your_table
    , (SELECT @parent := '', @num := -1) AS dummy
) AS your_table2
SET your_table.pos = your_table2.rownum
WHERE your_table.parent = your_table2.parent
AND your_table.child = your_table2.child

我假设 pos 值的逻辑是数据库的自然顺序。

所以基本上,这个查询会为每个断点创建一个新的 rownum 值。

SELECT parent
, child
, @num := IF(@parent = parent, @num + 1, 0) AS rownum
, @parent := parent
FROM your_table
, (SELECT @parent := '', @num := -1) AS dummy

然后这些值用于更新表格

【讨论】:

  • 感谢您的回答。它对 mysql 工作正常。我不明白你为什么会得到一些反对票:(
【解决方案2】:

MS SQL 的解决方案

update source_table
set source_table.POS = newposition_table.new_pos
from my_table source_table
inner join (select parent, 
                   child, 
                   ROW_NUMBER() over (partition by parent order by parent, pos) - 1 new_pos
            from my_table) newposition_table
on source_table.child = newposition_table.child

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2014-03-18
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多