我有一个表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有一种简单的方法可以做到这一点,但我不确定要搜索什么。 有更清洁的方法吗?
答案 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