Могу ли я "приклеить" 2 столбца к набору результатов? - PullRequest
0 голосов
/ 13 апреля 2011

Я работаю над некоторыми запросами в Oracle 10g - 10.2.0.40 в базе данных HP Quality Center 9.2.

Я создал запрос, который будет идти в папку с тестами, заданную клавишей SIGA, и выбирать только те тесты в данной папке, которые имеют правильную трассируемость до выпуска.

Также имеется 2 встречных подзапроса: TOTAL1 суммирует общее количество тестов в папке тестов. TOTAL2 возвращает общее количество тестов в папке тестов с правильной прослеживаемостью.

Запрос работает нормально, но имеет один недостаток: если ни один из тестов внутри папки не связан с правильным выпуском, набор результатов возвращается пустым, но, хотя я бы хотел, чтобы столбцы TOTAL1 и TOTAL2 были возвращены, как это:

|SIGA| |PROJETO| |ORIGEM|........ |TOTAL1| |TOTAL2|
|NULL| |NULL|    |NULL|  ........ |10|     |0|

Итак, дело в том, что каждый раз, когда TOTAL2 равен 0, «главный» resultSet пуст, как и должно быть, но даже если я хочу иметь столбцы TOTAL1 и TOTAL2.

Можно ли "приклеить" новый столбец с TOTAL1 и TOTAL2 к основному запросу даже с пустым набором результатов? Я пытался заставить меня присоединиться, но у меня ничего не вышло.

Спасибо, Клебер.

SELECT
    '@SIGA@'                 AS SIGA,
    CYCL_FOLD.CF_ITEM_NAME   AS Projeto,
    CYCLE.CY_CYCLE           AS Origem,
    REQ_NAMES.PROCESSO       AS Processo,
    REQ_NAMES.FUNCIONALIDADE AS Funcionalidade,
    ALL_LISTS.AL_DESCRIPTION AS Cenario,
    TEST.TS_TEST_ID          AS Test_ID,
    TESTCYCL.TC_USER_01      AS ID_Cliente,
    TEST.TS_NAME             AS Nome_do_Caso,
    TESTCYCL.TC_USER_02      AS Dependencia,
    TEST.TS_USER_06          AS Tipo_Teste,
    TEST.TS_USER_02          AS Tipo_Cenario,
    /* Descricao */
    REGEXP_REPLACE(CAST(TEST.TS_DESCRIPTION AS VARCHAR2(4000)), '<[^<]+>', NULL) AS Descricao,
    /* Pre_Condicao */
    REGEXP_REPLACE(CAST(TEST.TS_USER_25 AS VARCHAR2(4000)), '<[^<]+>', NULL) AS Pre_Condicao,
    /* Resultado_Esperado */
    REGEXP_REPLACE(CAST(TEST.TS_USER_26 AS VARCHAR2(4000)), '<[^<]+>', NULL) AS Resultado_Esperado,
    /* Dados_Necessarios */
    REGEXP_REPLACE(CAST(TEST.TS_USER_27 AS VARCHAR2(4000)), '<[^<]+>', NULL) AS Dados_Necessarios,
    TESTCYCL.TC_USER_04                                                      AS Resp_Execucao,
    TESTCYCL.TC_STATUS                                                       AS Status,
    TEST.TS_USER_03                                                          AS Sistemas_Impactados,
    TEST.TS_USER_05     AS Regressão,
    TEST.TS_RESPONSIBLE AS Autor_Do_Caso,
    /* Comentario */
    REGEXP_REPLACE(CAST(TEST.TS_DEV_COMMENTS AS VARCHAR2(4000)) , '<[^<]+>', NULL)AS Comentario,
    TOTAL1.Total_Testes_TestFolder,
    TOTAL2.Total_Testes_Com_Rastr
FROM
    (
        SELECT
            COUNT(TESTCYCL.TC_TEST_ID) AS Total_Testes_TestFolder
        FROM
            CYCLE,
            CYCL_FOLD,
            TESTCYCL
        WHERE
            TESTCYCL.TC_CYCLE_ID = CYCLE.CY_CYCLE_ID
        AND CYCLE.CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID
        AND CYCL_FOLD.CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
    )
    TOTAL1,
    (
        SELECT
            COUNT(DISTINCT CONCAT(TESTCYCL.TC_TESTCYCL_ID, TESTCYCL.TC_TEST_ID)) AS
            Total_Testes_Com_Rastr
        FROM
            CYCL_FOLD,
            CYCLE,
            TESTCYCL,
            REQ_COVER,
            REQ_CYCLES,
            RELEASE_CYCLES
        WHERE
            TESTCYCL.TC_CYCLE_ID = CYCLE.CY_CYCLE_ID
        AND cycle.CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID
        AND CYCL_FOLD.CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
        AND REQ_COVER.RC_ENTITY_ID = TESTCYCL.TC_TEST_ID
        AND REQ_COVER.RC_REQ_ID = REQ_CYCLES.RQC_REQ_ID
        AND REQ_CYCLES.RQC_CYCLE_ID = RELEASE_CYCLES.RCYC_ID
        AND RELEASE_CYCLES.RCYC_NAME LIKE CONCAT('@SIGA@','%')
        ORDER BY
            TESTCYCL.TC_TEST_ID
    )
    TOTAL2,
    CYCL_FOLD
LEFT JOIN RELEASE_CYCLES
ON
    RELEASE_CYCLES.RCYC_ID = CYCL_FOLD.CF_ASSIGN_RCYC
LEFT JOIN CYCLE
ON
    CYCLE.CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID
LEFT JOIN TESTCYCL
ON
    TESTCYCL.TC_CYCLE_ID = CYCLE.CY_CYCLE_ID
LEFT JOIN TEST
ON
    TEST.TS_TEST_ID = TESTCYCL.TC_TEST_ID
LEFT JOIN ALL_LISTS
ON
    ALL_LISTS.AL_ITEM_ID = TEST.TS_SUBJECT
INNER JOIN
    (
        SELECT
            TESTCYCL.TC_TEST_ID         AS TEST_ID,
            wm_concat(REQ2.RQ_REQ_NAME) AS Processo,
            wm_concat(REQ1.RQ_REQ_NAME) AS Funcionalidade
        FROM
            CYCL_FOLD
        LEFT JOIN CYCLE
        ON
            CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID
        RIGHT JOIN TESTCYCL
        ON
            TC_CYCLE_ID = CYCLE.CY_CYCLE_ID
        RIGHT JOIN REQ_COVER
        ON
            RC_ENTITY_ID = TESTCYCL.TC_TEST_ID
        INNER JOIN REQ REQ1
        ON
            RC_REQ_ID = REQ1.RQ_REQ_ID
        INNER JOIN REQ REQ2
        ON
            REQ1.RQ_FATHER_ID = REQ2.RQ_REQ_ID
        INNER JOIN REQ_TYPE
        ON
            REQ2.RQ_TYPE_ID = REQ_TYPE.TPR_TYPE_ID
            AND REQ_TYPE.TPR_NAME = 'Processo'
        RIGHT JOIN REQ_CYCLES
        ON
            RQC_REQ_ID = REQ1.RQ_REQ_ID
        INNER JOIN RELEASE_CYCLES
        ON
            RQC_CYCLE_ID = RELEASE_CYCLES.RCYC_ID
        AND CF_ASSIGN_RCYC = RELEASE_CYCLES.RCYC_ID
        WHERE
            CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
        GROUP BY
            TESTCYCL.TC_TEST_ID

        UNION

        SELECT
            TESTCYCL.TC_TEST_ID         AS TEST_ID,
            '' AS Processo,
            wm_concat(REQ1.RQ_REQ_NAME) AS Funcionalidade
        FROM
            CYCL_FOLD
        LEFT JOIN CYCLE
        ON
            CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID
        RIGHT JOIN TESTCYCL
        ON
            TC_CYCLE_ID = CYCLE.CY_CYCLE_ID
        RIGHT JOIN REQ_COVER
        ON
            RC_ENTITY_ID = TESTCYCL.TC_TEST_ID
        INNER JOIN REQ REQ1
        ON
            RC_REQ_ID = REQ1.RQ_REQ_ID
        INNER JOIN REQ REQ2
        ON
            REQ1.RQ_FATHER_ID = REQ2.RQ_REQ_ID
        INNER JOIN REQ_TYPE
        ON
            REQ2.RQ_TYPE_ID = REQ_TYPE.TPR_TYPE_ID
            AND REQ_TYPE.TPR_NAME <> 'Processo'
        RIGHT JOIN REQ_CYCLES
        ON
            RQC_REQ_ID = REQ1.RQ_REQ_ID
        INNER JOIN RELEASE_CYCLES
        ON
            RQC_CYCLE_ID = RELEASE_CYCLES.RCYC_ID
        AND CF_ASSIGN_RCYC = RELEASE_CYCLES.RCYC_ID
        WHERE
            CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
        GROUP BY
            TESTCYCL.TC_TEST_ID
    )
    REQ_NAMES
ON
    REQ_NAMES.TEST_ID = TEST.TS_TEST_ID
WHERE
    CYCL_FOLD.CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
ORDER BY
    CYCLE.CY_CYCLE,
    ALL_LISTS.AL_DESCRIPTION,
    REQ_NAMES.PROCESSO,
    TEST.TS_TEST_ID

Ответы [ 2 ]

0 голосов
/ 15 апреля 2011

Как я уже говорил выше, друг помог мне найти решение.

Поскольку запись PROJETO должна существовать всегда, у меня всегда будет одна строка, в которой я должен вернуть TOTAL1 и TOTAL2, дажекогда есть 0 тестов с правильной прослеживаемостью (что означает TOTAL2 = 0)

Итак, мне нужен был один запрос и один подзапрос.

Первый запрос будет искать папку PROJETOзатем LEFT JOIN в подзапрос, который имеет всю основную логику, затем CROSS с TOTAL1 и TOTAL2.

Итак, если папка проекта существует, есть тесты, но 0 из них имеют правильныеПри прослеживаемости внешний запрос вернул бы то, что я просил (и даже лучше):

|SIGA| |PROJETO         | |ORIGEM|........ |TOTAL1| |TOTAL2|
|1234| |1234 - Project X| |NULL  |........ |10|     |0|

Я не уверен, что могу так звонить, но я представляю это как «запрос обтекания»: все записивозвращенный в подзапросе оберните нужными столбцами.

В любом случае, вот код:

SELECT
    '@SIGA@'               AS SIGA,
    CYCL_FOLD.CF_ITEM_NAME AS Projeto,
    Origem,
    Processo,
    Funcionalidade,
    Cenario,
    Test_ID,
    Instancia_Do_Teste,
    ID_Cliente,
    Nome_do_Caso,
    Dependencia,
    Tipo_Teste,
    Tipo_Cenario,
    Descricao,
    Pre_Condicao,
    Resultado_Esperado,
    Dados_Necessarios,
    Resp_Execucao,
    Status_Execução_Caso,
    Sistemas_Impactados_Teste,
    Regressao,
    Autor_Do_Caso,
    Ordem_Dos_Passos,
    Nome_do_Passo,
    Descricao_do_Passo,
    Resultado_Esperado_Passo,
    Sistemas_Impactado_Passo,
    Provedor,
    ST_RUN_ID,
    Status_Execução_Passo,
    TOTAL1.Total_Testes_TestFolder,
    TOTAL2.Total_Testes_Com_Rastr
FROM
    CYCL_FOLD
LEFT JOIN
    (
        SELECT
            CYCL_FOLD.CF_ITEM_NAME,
            '@SIGA@'                 AS SIGA,
            CYCL_FOLD.CF_ITEM_NAME   AS Projeto,
            CYCLE.CY_CYCLE           AS Origem,
            REQ_NAMES.PROCESSO       AS Processo,
            REQ_NAMES.FUNCIONALIDADE AS Funcionalidade,
            ALL_LISTS.AL_DESCRIPTION AS Cenario,
            TEST.TS_TEST_ID          AS Test_ID,
            TC_TEST_INSTANCE         AS Instancia_Do_Teste,
            TESTCYCL.TC_USER_01 AS ID_Cliente,
            TEST.TS_NAME        AS Nome_do_Caso,
            TESTCYCL.TC_USER_02 AS Dependencia,
            TEST.TS_USER_06     AS Tipo_Teste,
            TEST.TS_USER_02     AS Tipo_Cenario,
            /* Descricao */
            REGEXP_REPLACE(CAST(TEST.TS_DESCRIPTION AS VARCHAR2(4000)), '<[^<]+>', NULL) AS
            Descricao,
            /* Pre_Condicao */
            REGEXP_REPLACE(CAST(TEST.TS_USER_25 AS VARCHAR2(4000)), '<[^<]+>', NULL) AS
            Pre_Condicao,
            /* Resultado_Esperado */
            REGEXP_REPLACE(CAST(TEST.TS_USER_26 AS VARCHAR2(4000)), '<[^<]+>', NULL) AS
            Resultado_Esperado,
            /* Dados_Necessarios */
            REGEXP_REPLACE(CAST(TEST.TS_USER_27 AS VARCHAR2(4000)), '<[^<]+>', NULL) AS
            Dados_Necessarios,
            TESTCYCL.TC_USER_04 AS Resp_Execucao,
            TESTCYCL.TC_STATUS  AS Status_Execução_Caso,
            TEST.TS_USER_03     AS Sistemas_Impactados_Teste,
            TEST.TS_USER_05     AS Regressao,
            TEST.TS_RESPONSIBLE AS Autor_Do_Caso,
            /* Comentario */
            REGEXP_REPLACE(CAST(TEST.TS_DEV_COMMENTS AS VARCHAR2(4000)) , '<[^<]+>', NULL)AS
            Comentario,
            DESSTEPS.DS_STEP_ORDER AS Ordem_Dos_Passos,
            DESSTEPS.DS_STEP_NAME  AS Nome_do_Passo,
            /* Descrição do Passo */
            REGEXP_REPLACE(CAST(DESSTEPS.DS_DESCRIPTION AS VARCHAR2(4000)), '<[^<]+>', NULL) AS
            Descricao_do_Passo,
            /* Resultado Esperado do Passo */
            REGEXP_REPLACE(CAST(DESSTEPS.DS_EXPECTED AS VARCHAR2(4000)), '<[^<]+>', NULL) AS
            Resultado_Esperado_Passo,
            DESSTEPS.DS_USER_01 AS Sistemas_Impactado_Passo,
            DESSTEPS.DS_USER_02 AS Provedor,
            STEP.ST_RUN_ID,
            STEP.ST_STATUS AS Status_Execução_Passo
        FROM
            CYCL_FOLD
        LEFT JOIN RELEASE_CYCLES
        ON
            RELEASE_CYCLES.RCYC_ID = CYCL_FOLD.CF_ASSIGN_RCYC
        LEFT JOIN CYCLE
        ON
            CYCLE.CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID
        LEFT JOIN TESTCYCL
        ON
            TESTCYCL.TC_CYCLE_ID = CYCLE.CY_CYCLE_ID
        LEFT JOIN TEST
        ON
            TEST.TS_TEST_ID = TESTCYCL.TC_TEST_ID
        LEFT JOIN DESSTEPS
        ON
            DESSTEPS.DS_TEST_ID = TEST.TS_TEST_ID
        LEFT JOIN RUN
        ON
            RN_TEST_ID = TEST.TS_TEST_ID
        AND RN_TESTCYCL_ID = TESTCYCL.TC_TESTCYCL_ID
        AND RN_CYCLE_ID = CYCLE.CY_CYCLE_ID
        LEFT JOIN STEP
        ON
            ST_TEST_ID = DS_TEST_ID
        AND ST_DESSTEP_ID = DESSTEPS.DS_ID
        AND ST_RUN_ID = RN_RUN_ID
        LEFT JOIN ALL_LISTS
        ON
            ALL_LISTS.AL_ITEM_ID = TEST.TS_SUBJECT
        INNER JOIN
            (
                SELECT
                    TESTCYCL.TC_TEST_ID         AS TEST_ID,
                    wm_concat(REQ2.RQ_REQ_NAME) AS Processo,
                    wm_concat(REQ1.RQ_REQ_NAME) AS Funcionalidade
                FROM
                    CYCL_FOLD
                LEFT JOIN CYCLE
                ON
                    CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID
                RIGHT JOIN TESTCYCL
                ON
                    TC_CYCLE_ID = CYCLE.CY_CYCLE_ID
                RIGHT JOIN REQ_COVER
                ON
                    RC_ENTITY_ID = TESTCYCL.TC_TEST_ID
                INNER JOIN REQ REQ1
                ON
                    RC_REQ_ID = REQ1.RQ_REQ_ID
                INNER JOIN REQ REQ2
                ON
                    REQ1.RQ_FATHER_ID = REQ2.RQ_REQ_ID
                INNER JOIN REQ_TYPE
                ON
                    REQ2.RQ_TYPE_ID = REQ_TYPE.TPR_TYPE_ID
                AND REQ_TYPE.TPR_NAME = 'Processo'
                RIGHT JOIN REQ_CYCLES
                ON
                    RQC_REQ_ID = REQ1.RQ_REQ_ID
                INNER JOIN RELEASE_CYCLES
                ON
                    RQC_CYCLE_ID = RELEASE_CYCLES.RCYC_ID
                AND CF_ASSIGN_RCYC = RELEASE_CYCLES.RCYC_ID
                WHERE
                    CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
                GROUP BY
                    TESTCYCL.TC_TEST_ID
                UNION
                SELECT
                    TESTCYCL.TC_TEST_ID         AS TEST_ID,
                    ''                          AS Processo,
                    wm_concat(REQ1.RQ_REQ_NAME) AS Funcionalidade
                FROM
                    CYCL_FOLD
                LEFT JOIN CYCLE
                ON
                    CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID
                RIGHT JOIN TESTCYCL
                ON
                    TC_CYCLE_ID = CYCLE.CY_CYCLE_ID
                RIGHT JOIN REQ_COVER
                ON
                    RC_ENTITY_ID = TESTCYCL.TC_TEST_ID
                INNER JOIN REQ REQ1
                ON
                    RC_REQ_ID = REQ1.RQ_REQ_ID
                INNER JOIN REQ REQ2
                ON
                    REQ1.RQ_FATHER_ID = REQ2.RQ_REQ_ID
                INNER JOIN REQ_TYPE
                ON
                    REQ2.RQ_TYPE_ID = REQ_TYPE.TPR_TYPE_ID
                AND REQ_TYPE.TPR_NAME <> 'Processo'
                RIGHT JOIN REQ_CYCLES
                ON
                    RQC_REQ_ID = REQ1.RQ_REQ_ID
                INNER JOIN RELEASE_CYCLES
                ON
                    RQC_CYCLE_ID = RELEASE_CYCLES.RCYC_ID
                AND CF_ASSIGN_RCYC = RELEASE_CYCLES.RCYC_ID
                WHERE
                    CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
                GROUP BY
                    TESTCYCL.TC_TEST_ID
            )
            REQ_NAMES
        ON
            REQ_NAMES.TEST_ID = TEST.TS_TEST_ID
        WHERE
            CYCL_FOLD.CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
        AND
            (
                RN_RUN_ID IS NULL
             OR RN_RUN_ID =
                (
                    SELECT
                        MAX(RN_RUN_ID)
                    FROM
                        RUN
                    WHERE
                        RN_TEST_ID = TEST.TS_TEST_ID
                    AND RN_TEST_INSTANCE = TC_TEST_INSTANCE
                )
            )
    )
    mainQuery
ON
    CYCL_FOLD.CF_ITEM_NAME = mainQuery.CF_ITEM_NAME
CROSS JOIN
    (
        SELECT
            COUNT(TESTCYCL.TC_TEST_ID) AS Total_Testes_TestFolder
        FROM
            CYCLE,
            CYCL_FOLD,
            TESTCYCL
        WHERE
            TESTCYCL.TC_CYCLE_ID = CYCLE.CY_CYCLE_ID
        AND CYCLE.CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID
        AND CYCL_FOLD.CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
    )
    TOTAL1
CROSS JOIN
    (
        SELECT
            COUNT(DISTINCT CONCAT(TESTCYCL.TC_TESTCYCL_ID, TESTCYCL.TC_TEST_ID)) AS
            Total_Testes_Com_Rastr
        FROM
            CYCL_FOLD,
            CYCLE,
            TESTCYCL,
            REQ_COVER,
            REQ_CYCLES,
            RELEASE_CYCLES
        WHERE
            TESTCYCL.TC_CYCLE_ID = CYCLE.CY_CYCLE_ID
        AND cycle.CY_FOLDER_ID = CYCL_FOLD.CF_ITEM_ID
        AND CYCL_FOLD.CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
        AND REQ_COVER.RC_ENTITY_ID = TESTCYCL.TC_TEST_ID
        AND REQ_COVER.RC_REQ_ID = REQ_CYCLES.RQC_REQ_ID
        AND REQ_CYCLES.RQC_CYCLE_ID = RELEASE_CYCLES.RCYC_ID
        AND RELEASE_CYCLES.RCYC_NAME LIKE CONCAT('@SIGA@','%')
        ORDER BY
            TESTCYCL.TC_TEST_ID
    )
    TOTAL2
WHERE
    CYCL_FOLD.CF_ITEM_NAME LIKE CONCAT('@SIGA@','%')
ORDER BY
    Origem,
    Funcionalidade,
    Cenario,
    Test_ID,
    Instancia_Do_Teste,
    Ordem_Dos_Passos
0 голосов
/ 13 апреля 2011

Так что, если LEFT OUTER JOIN не сделал то, что вы хотите, возможно, вы ищете RIGHT OUTER JOIN или FULL OUTER JOIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...