选择具有特定值的行之后的所有行,而不重复相同的子查询

时间:2011-09-10 00:05:08

标签: oracle oracle9i

我有一个表t1和t2,我加入并命令形成数据集set1。

两列c1和c2形成set1中行的唯一标识符。

我希望在第一行之后使用特定的c1和c2从set1获取所有值。

我有一个类似下面的查询,但是它会重复两次相同的子查询,这对于Oracle来说似乎是多余的而且过于复杂:

SELECT * FROM
(
  SELECT row_number() OVER (ORDER BY c1, c3) myOrder, c1, c2, c3
  FROM t1, t2
  WHERE condition
  ORDER BY conditions
) sub1,
(
  SELECT sub1_again.myOrder FROM
  (
    SELECT row_number() OVER (ORDER BY c1, c3) myOrder, c2, c3
    FROM t1, t2
    WHERE condition
    ORDER BY conditions
  ) sub1_again
  WHERE sub1_again.c2 = "foo" AND sub1_again.c3 = "bar"
) sub2
WHERE sub1.myOrder >= sub2.myOrder
ORDER BY sub1.myOrder

似乎SQL有一种简单的方法可以做到这一点,但我不确定要搜索什么。 有更清洁的方法吗?

3 个答案:

答案 0 :(得分:3)

SELECT * FROM (
  SELECT row_number() OVER (ORDER BY c1, c3) myOrder, c2, c3
        ,CASE WHEN c2 = "foo" AND c3 = "bar"
              THEN row_number() OVER (ORDER BY c1, c3)
         END target_rn
  FROM t1, t2
  WHERE condition
  ORDER BY conditions
) WHERE myOrder > target_rn;

答案 1 :(得分:0)

我认为公认的解决方案中缺少某些内容。但是,它帮助我提出了以下建议:

SELECT * FROM (
  SELECT row_number() OVER (ORDER BY c1, c3) myOrder, c1, c2, c3,
    max(case when c2 = "foo" AND c3 = "bar" then 1 else 0 end) over (order by c1, c3) rowFound,
  FROM t1, t2
  WHERE condition
)
WHERE rowFound > 0
ORDER BY conditions

基本上,case正在选择从哪一行开始,而max从该行开始“拖动”值。最后一个WHERE进行过滤。

答案 2 :(得分:-1)

请尝试更具体,如果我理解你只需添加参数'where',例如:SELECT * FROM **where** element