Выбор всех строк после строки с конкретными значениями без повторения одного и того же подзапроса - PullRequest
4 голосов
/ 10 сентября 2011

У меня есть таблица t1 и t2, к которой я присоединяюсь и приказываю сформировать набор данных set1.

Два столбца c1 и c2 образуют уникальный идентификатор для строк в set1.

Я хочучтобы получить все значения из set1 после первой строки с определенными c1 и c2.

У меня есть запрос, подобный приведенному ниже, который работает, но он повторяет один и тот же подзапрос дважды, что кажется излишним и слишком сложным даже для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 ]

3 голосов
/ 10 сентября 2011
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;
0 голосов
/ 14 мая 2019

Я думаю, что-то не хватает в принятом решении.Тем не менее, это помогло мне придумать следующее:

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 "перетаскивает" значение из этой строки и далее,Последнее ГДЕ делает фильтрацию.

0 голосов
/ 10 сентября 2011

Пожалуйста, попробуйте более конкретно, если я правильно понял, вам нужно просто добавить параметр 'where', например: SELECT * FROM **where** element

...