Oracle SQL, как ограничить соединение? - PullRequest
0 голосов
/ 10 июля 2020

Это HP / IBM Quality Center;

Есть три таблицы.

У testcycl есть тест, а у теста есть шаги. Шаги имеют много дубликатов по своей природе из-за множества прогонов.

Следовательно, для данного TestCycle я хотел бы получить все тесты, включая их шаги, для самого последнего st_run_id .

Пробовал себя сдерживать, но у меня ничего не получается. 1 Цикл может иметь 500 тестов, которые дают 5000 шагов из-за повторяющихся прогонов, очень легко застрять.

Как ограничить запрос шагов на основе самого последнего st_run_id, имея в виду, что он должен быть ограничен st_test_id ?

select *
from
(
    -- Get details for that test
    select
        ts_test_id,
        ts_name,
        ts_description
    from test
    where 1=1
    and ts_test_id in
    (
            -- Get all test ID's belonging to a specific cycle
            select distinct tc_test_id
            from testcycl
            where 1=1
            and testcycl.tc_assign_rcyc = 1021
    )
) tests
-- Get the steps
left join
(
    select
        step.st_test_id,
        step.st_run_id,
        step.st_execution_date,
        step.st_id,
        step.st_step_name,
        step.st_description,
        step.st_expected
    from step
    where 1=1
) steps
on tests.ts_test_id = steps.st_test_id

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вы должны использовать прямые таблицы вместо подзапроса следующим образом:

Select * from
(select t.*, s.*,
        row_number() over (partition by s.st_test_id order by s.st_run_id desc nulls last) as rn
    from test t 
    Left join steps s on t.ts_test_id = s.st_test_id 
    where 1=1
    and t.ts_test_id in
    (
            -- Get all test ID's belonging to a specific cycle
            select distinct tc_test_id
            from testcycl
            where 1=1
            and testcycl.tc_assign_rcyc = 1021
    )
) Where rn = 1;

Вы можете использовать только то columns в select предложении, которое вам нужно.

0 голосов
/ 10 июля 2020

Это должно делать то, что вы хотите:

left join
(select s.*,
        row_number() over (partition by s.st_test_id order by st.st_run_id desc) as seqnum
) steps
on tests.ts_test_id = steps.st_test_id and steps.seqnum = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...