里面的CASE语句使用子查询与生成序列ID
里面我用子查询的CASE
声明,并在子查询我们希望与自动序列值或计数器值一起一列。例如 CASE
声明里面查询就是这样的,我们通过一列col1
在WHERE
的条件下&得到输出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
这是一个很好的解决方案,当你不小心给定行是否是1
,2
或99999
。如果你有一些特殊的要求,你可能要使用的解析函数像row_number()
代替:
SELECT COL1, row_number() over (order by COL2) as CNT FROM TAB1 WHERE
回答:
一般来说,“更好”取决于你想要做什么。
有几个可能的情形:
你集返回给调用一些代码/用户的结果。调用序列可能是不必要的开销,并且不允许使用更复杂的行编号表达式。
在这种情况下,我会使用哪个最适合的
rownum
和各种分析行编号函数,row_number()
,rank()
和dense_rank()
由于您的查询是如何构建的很可能是你应该使用这种方法的。
您正在将此数据插入表中。我更喜欢序列是一个标识列或在12c之前,在触发器。这是因为除了单个语句之外的其他代码可能会执行插入操作,并且您希望确保更改表中数据的所有传入数据都以相同方式处理。
换句话说,不要在您的代码中使用序列来执行此操作。
您正在生成一个唯一标识,您将向用户显示并插入表中。如果您有手动批准步骤,这种结构最有用。由于(2)中详述的原因,您要要使用序列来确保数据处理相同。
另一种可能会导致锁定的方法是执行插入操作,然后向用户显示未提交的数据。用户然后必须提交或回滚适当的。
如果您正在进行这些操作,您将失去未提交的序列值。这根本不重要,但由于某种原因它困扰了一些人。
以上是 里面的CASE语句使用子查询与生成序列ID 的全部内容, 来源链接: utcz.com/qa/266056.html