里面的CASE语句使用子查询与生成序列ID

里面我用子查询的CASE声明,并在子查询我们希望与自动序列值或计数器值一起一列。例如 CASE声明里面查询就是这样的,我们通过一列col1WHERE的条件下&得到输出col2以及CNT。里面的CASE语句使用子查询与生成序列ID

(CASE WHEN (SELECT COL2, ROWNUM AS CNT FROM TAB1 WHERE COL1 = COL1) THEN ....) 

每当任何值col1将匹配,则col2的输出将被与CNT增量值产生沿。

CNT是这里计数器的值等1,2,3,4,.....哪一个是更好的选择或者使用计数器或序列。

回答:

“哪一个是更好的选择,或者使用计数器或序列。”

您是否总是希望CNT以1开头?如果是这样,你不想要一个序列。

有许多不同的方法可以为CNT生成一个值。最简单的就是使用rownum伪列:

SELECT COL1, rownum as CNT FROM TAB1 WHERE 

这是一个很好的解决方案,当你不小心给定行是否是1299999。如果你有一些特殊的要求,你可能要使用的解析函数像row_number()代替:

SELECT COL1, row_number() over (order by COL2) as CNT FROM TAB1 WHERE 

回答:

一般来说,“更好”取决于你想要做什么。

有几个可能的情形:

  1. 你集返回给调用一些代码/用户的结果。调用序列可能是不必要的开销,并且不允许使用更复杂的行编号表达式。

    在这种情况下,我会使用哪个最适合的rownum和各种分析行编号函数,row_number()rank()dense_rank()

    由于您的查询是如何构建的很可能是你应该使用这种方法的。

  2. 您正在将此数据插入表中。我更喜欢序列是一个标识列或在12c之前,在触发器。这是因为除了单个语句之外的其他代码可能会执行插入操作,并且您希望确保更改表中数据的所有传入数据都以相同方式处理。

    换句话说,不要在您的代码中使用序列来执行此操作。

  3. 您正在生成一个唯一标识,您将向用户显示并插入表中。如果您有手动批准步骤,这种结构最有用。由于(2)中详述的原因,您要使用序列来确保数据处理相同。

    另一种可能会导致锁定的方法是执行插入操作,然后向用户显示未提交的数据。用户然后必须提交或回滚适当的。

    如果您正在进行这些操作,您将失去未提交的序列值。这根本不重要,但由于某种原因它困扰了一些人。

以上是 里面的CASE语句使用子查询与生成序列ID 的全部内容, 来源链接: utcz.com/qa/266056.html

回到顶部