2011-04-13 130 views
0

在HP Quality Center 9.2数据库中,我正在对Oracle 10g - 10.2.0.40进行一些查询。我可以将2列粘贴到resultSet吗?

我构建了一个查询,该查询将转到由SIGA键给出的测试文件夹,只选择给定测试文件夹内对该发行版具有正确可跟踪性的测试。

它也有2个计数器子查询: TOTAL1总和测试文件夹中的测试总数。 TOTAL2以正确的可追溯性返回测试文件夹中的测试总量。

该查询工作正常,但有一个缺陷:如果文件夹内没有任何测试与正确的版本相关联,则结果集返回空,但即使如此,我希望返回TOTAL1和TOTAL2列,像这样:

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

那么,事情是:每次共2为0时,“主” ResultSet是空的,因为它应该,但即使强硬。我希望有共1页和页共2列。

即使使用空的resultSet,是否可以将TOTAL1和TOTAL2的新列“粘合”到主查询中?我试图让左连接,但没有工作。

谢谢, Cleber。

SELECT 
    '@[email protected]'     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('@[email protected]','%') 
    ) 
    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('@[email protected]','%') 
     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('@[email protected]','%') 
     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('@[email protected]','%') 
     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('@[email protected]','%') 
     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('@[email protected]','%') 
ORDER BY 
    CYCLE.CY_CYCLE, 
    ALL_LISTS.AL_DESCRIPTION, 
    REQ_NAMES.PROCESSO, 
    TEST.TS_TEST_ID 
+4

我觉得上面的查询替换为属于thedailywtf.com .... – Chandu 2011-04-13 02:37:54

+0

我的一个朋友说,他将它发送到那里,我不知道网站,可能已经=) 今天我发现了一个更好的方法来做到这一点: 'REGEXP_REPLACE(CAST(TEST.TS_DESCRIPTION AS VARCHAR2(4000)),'<[^<]+>',NULL)AS Descricao,' – cbaldan 2011-04-13 13:09:23

+0

thedaily wtf ...大声笑 – tbone 2011-04-13 14:29:17

回答

0

所以,如果LEFT OUTER JOIN没你想它可能是你正在寻找一个RIGHT OUTER JOINFULL OUTER JOIN什么。

+1

bw_üzi,谢谢你花时间。 一位朋友帮我解决了问题,并找到了一个解决方案:一个查询总是至少有一行,并且所有主查询都被移动到一个内部查询中,并带有'LEFT JOIN' – cbaldan 2011-04-13 19:43:44

0

就像我上面说的,一位朋友帮我找到了解决方案。

由于PROJETO记录应该永远存在,我总是有一排我需要返回共1页及共2条,即使有0测试用正确的可追溯性(这意味着共2 = 0)

那么,是什么我需要的是一个查询和一个子查询。

第一个查询将查找PROJETO文件夹,然后LEFT JOIN到具有所有主要的逻辑子查询,然后用TOTAL1TOTAL2交叉。

那么,万一项目文件夹存在,有测试,但其中0有正确的可追溯性,外部查询将返回我问(甚至更好):

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

我不知道如果我可以这样调用,但我将其想象为一个“包装查询”:子查询中返回的所有记录都会包含我需要的列。

总之,这里是代码:

SELECT 
    '@[email protected]'    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, 
      '@[email protected]'     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('@[email protected]','%') 
       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('@[email protected]','%') 
       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('@[email protected]','%') 
     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('@[email protected]','%') 
    ) 
    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('@[email protected]','%') 
     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('@[email protected]','%') 
     ORDER BY 
      TESTCYCL.TC_TEST_ID 
    ) 
    TOTAL2 
WHERE 
    CYCL_FOLD.CF_ITEM_NAME LIKE CONCAT('@[email protected]','%') 
ORDER BY 
    Origem, 
    Funcionalidade, 
    Cenario, 
    Test_ID, 
    Instancia_Do_Teste, 
    Ordem_Dos_Passos 
相关问题