使用LAST_VALUE在UNION ALL中保留订单吗?

时间:2013-06-03 09:53:07

标签: oracle oracle10g union-all

大家好:)我在Oracle 10g中有这个查询:

SELECT 
  LAST_VALUE(SERIAL_ID) OVER (),
  LAST_VALUE(COLOR) OVER ()
FROM (
  SELECT SERIAL_ID, COLOR FROM TABLE_1
  UNION ALL
  SELECT SERIAL_ID, COLOR FROM TABLE_2
) WHERE SERIAL_ID = <PUT UNIQUE ID TO TABLE_1 and TABLE_2 HERE>

TABLE_1TABLE_2具有完全相同的架构,但数据不同。 SERIAL_ID有一个唯一约束,但在两个表中都可以找到一个SERIAL_ID。

到目前为止,当LAST_VALUE(COLOR) OVER ()中存在匹配时,TABLE_2始终会将TABLE_1的值从TABLE_2返回。这就是我想要的。

我无法在文档中找到告诉我UNION ALL的订单将被保留的信息。在我看来,UNION ALL来自 set realm ,我不知道Oracle是否保留以未定义的顺序呈现此集的权利。

我想确保订单保持不变。

祝你好运

2 个答案:

答案 0 :(得分:3)

除非记录在案,否则Tom Kyte's mantra以外的任何关于订购的事情是不安全的。即使它现在似乎总是有效,但这并不意味着你不会在当前版本或未来版本中发现它的工作方式不同。

您可以通过向联盟的每个分支添加一个标志来确保这一点:

SELECT 
  LAST_VALUE(SERIAL_ID) OVER (ORDER BY FLAG
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
  LAST_VALUE(COLOR) OVER (ORDER BY FLAG
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM (
  SELECT SERIAL_ID, COLOR, 1 AS FLAG FROM TABLE_1
  UNION ALL
  SELECT SERIAL_ID, COLOR, 2 AS FLAG FROM TABLE_2
) WHERE SERIAL_ID = <PUT UNIQUE ID TO TABLE_1 and TABLE_2 HERE>

即使您(人为地)通过向内部查询SQL Fiddle添加ORDER BY FLAG DESC来突破它,这也会有效。

答案 1 :(得分:0)

好吧,UNION ALL总是为我返回有序数据。从第一个开始,所有列都是订单。要按您需要的顺序设置记录,您必须在两个内部查询中生成一些附加字段,然后在外部查询中对该字段进行排序。