2013-09-13 3 views
1

у меня есть два запроса, которые я бегу в HP ALM (формально Quality Center):Right Join не возвращает все ожидаемые строки

Запрос 1:

SELECT 
TEST.TS_NAME 
FROM CYCLE 
JOIN TESTCYCL ON (TESTCYCL.TC_CYCLE_ID = CYCLE.CY_CYCLE_ID) 
JOIN TEST ON TEST.TS_TEST_ID = TESTCYCL.TC_TEST_ID) 
WHERE CYCLE.CY_CYCLE_ID = 44451 

Это возвращает 38 строк со всеми именами тестов Я хочу сообщить об этом.

Запрос 2:

SELECT 
STEP.ST_RUN_ID as "RunId" /*Test Step.Run No*/ , 
TEST.TS_NAME as "Test Name", 
STEP.ST_STATUS as "Run Status", 
STEP.ST_STEP_NAME as "Step Name", 
CYCLE.CY_CYCLE as "TestSet", 
CYCL_FOLD.CF_ITEM_NAME as "Test Lab Folder Name" 
FROM RUN, CYCL_FOLD, CYCLE, STEP, TEST 
WHERE RUN.RN_CYCLE_ID = CYCLE.CY_CYCLE_ID 
AND CYCLE.CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID 
AND CYCLE.CY_CYCLE_ID = 44451 
AND STEP.ST_RUN_ID = RUN.RN_RUN_ID 
AND RUN.RN_TEST_ID = TEST.TS_TEST_ID 
AND RUN.RN_RUN_ID in (select MAX(RUN.RN_RUN_ID) FROM RUN 
GROUP BY RN_TESTCYCLE_ID) 

Этот запрос возвращает все тесты с отдельными этапами и их статус. Оператор MAX возвращает последний запуск этого теста.

Когда тест выполняется, в таблице STEP назначается RUN_ID. Проблема в том, что если тест не был запущен, он не будет иметь идентификатор RUN_ID и поэтому не будет включен в результаты.

Так что я создал ниже запрос 3:

SELECT 
STEP.ST_RUN_ID as "RunId" /*Test Step.Run No*/, 
TEST.TS_NAME as "Test Name", 
STEP.ST_STATUS as "Run Status", 
STEP.ST_STEP_NAME as "Step Name", 
CYCLE.CY_CYCLE as "TestSet", 
CYCL_FOLD.CF_ITEM_NAME as "Test Lab Folder Name" 
FROM RUN, CYCL_FOLD, CYCLE, STEP, TEST 
    RIGHT JOIN (
      SELECT 
      TEST.TS_NAME 
      FROM CYCLE 
      JOIN TESTCYCL ON (TESTCYCL.TC_CYCLE_ID = CYCLE.CY_CYCLE_ID) 
      JOIN TEST ON TEST.TS_TEST_ID = TESTCYCL.TC_TEST_ID) 
      WHERE CYCLE.CY_CYCLE_ID = 44451) alltest 
      ON alltest.TS_NAME = TEST.TS_NAME 
WHERE RUN.RN_CYCLE_ID = CYCLE.CY_CYCLE_ID 
AND CYCLE.CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID 
AND STEP.ST_RUN_ID = RUN.RN_RUN_ID 
AND RUN.RN_TEST_ID = TEST.TS_TEST_ID 
AND RUN.RN_RUN_ID in (select MAX(RUN.RN_RUN_ID) FROM RUN GROUP BY rn_testcycl_id) 

Я хотел RIGHT JOIN на все испытания и заполнения строки, которые имеют пробег записан, но он по-прежнему не возвращает NULL строки. Нет никакой разницы между выполняемым запросом 2 или 3.

ответ

1

Он не возвращает строки, потому что предложение where отфильтровывает их.

Используйте стандарт ANSI join (пункт on) и поместите условия в пункт on. В результате получается нечто вроде этого:

SELECT s.ST_RUN_ID as "RunId" /*Test Step.Run No*/, t.TS_NAME as "Test Name", 
     s.ST_STATUS as "Run Status", s.ST_STEP_NAME as "Step Name", c.CY_CYCLE as "TestSet", 
     cf.CF_ITEM_NAME as "Test Lab Folder Name" 
FROM RUN r join 
    CYCL_FOLD cf 
    on c.RN_CYCLE_ID = cf.CY_CYCLE_ID join 
    CYCLE c 
    on c.CY_FOLDER_ID = cf.CF_ITEM_ID join 
    STEP s 
    on s.ST_RUN_ID = r.RN_RUN_ID join 
    TEST t 
    on r.RN_TEST_ID = t.TS_TEST_ID right join 
    (SELECT TEST.TS_NAME 
     FROM CYCLE JOIN 
      TESTCYCL 
      ON TESTCYCL.TC_CYCLE_ID = CYCLE.CY_CYCLE_ID JOIN 
      TEST 
      ON TEST.TS_TEST_ID = TESTCYCL.TC_TEST_ID 
     WHERE CYCLE.CY_CYCLE_ID = 44451 
    ) alltest 
    ON alltest.TS_NAME = t.TS_NAME and 
     r.RN_RUN_ID in (select MAX(RUN.RN_RUN_ID) FROM RUN GROUP BY rn_testcycl_id); 
+0

Большое спасибо за быстрый ответ. Это решило мою проблему. – user2776001

-3

Если вы хотите, чтобы получить нулевые значения имеют правое внешнее соединение, а не право присоединиться ..

+0

Спасибо, что ответили, но я попробовал это, но он просто вернул те же результаты. – user2776001

+2

isnt right external join and right join the same thing? – freerunner

Смежные вопросы