0

大家好 :) 我在 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_2over返回值。这就是我想要的。TABLE_1TABLE_2

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

我想确保订单保持不变。

此致

4

2 回答 2

3

除非有文件证明,否则除了Tom Kyte 的口头禅之外,假设任何关于订购的事情都是不安全的。即使它现在似乎总是有效,但这并不意味着您有一天不会发现它在当前或未来版本中的工作方式有所不同。

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

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>

即使您(人为地)通过向ORDER BY FLAG DESC内部查询添加一个来破坏它,这也将起作用 - SQL Fiddle显示了这一点。

于 2013-06-03T11:14:14.700 回答
0

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

于 2013-06-03T09:57:35.227 回答