2017-08-12 47 views
0

當我對實際數據嘗試了以下查詢時,它返回的記錄數更多。請幫助解決此問題。使用SYS_CONNECT_BY_PATH的Oracle累計計數

下面是表DM_TEMP_SUMMING_DVC_BY_FW實際數據

+-----------+-------+-----------------+------------+------------------+ 
device_count| dmc_id| firmware_version| cg_id  |image_prerequisite| 
+-----------+-------+-----------------+------------+------------------+ 
| 40  | 408 |RT2    |0000  |RT1    | 
| 24  | 408 |RT3    |0000  |RT2    | 
| 18  | 408 |RT4    |0000  |RT3    | 
| 2109  | 408 |RT1    |0000  |null    | 
| 1   | 142 |RT1    |0000  |null    | 
| 1   | 142 |RT2    |0000  |RT1    | 
| 1   | 408 |RT1    |HFOTA1  |null    | 
| 1   | 408 |RT1    |HFOTA2  |null    | 
| 1   | 408 |RT1    |HFOTA3  |null    | 
| 1   | 408 |RT1    |HFOTA4  |null    | 
| 1   | 408 |RT1    |HFOTA5  |null    | 
+-----------+-------+-----------------+------------+------------------+ 

,我已執行查詢:

SELECT SYS_CONNECT_BY_PATH(firmware_version, '/') path_, 
    firmware_version, 
    device_count, 
    dmc_id, 
    charging_group_id , 
    IMAGE_PREREQUISITE, 
    (SELECT SUM(device_count) 
    FROM DM_TEMP_SUMMING_DVC_BY_FW t2 
    START WITH t1.firmware_version   =t2.firmware_version 
    CONNECT BY nocycle PRIOR firmware_version=image_prerequisite 
) sum_device 
FROM DM_TEMP_SUMMING_DVC_BY_FW t1 
    START WITH image_prerequisite   IS NULL 
    CONNECT BY nocycle PRIOR firmware_version =image_prerequisite 

預期結果:從查詢

+--------------------+-------+-----------------+-------+--------------------+ 
cumm_device_count | dmc_id| firmware_version| cg_id |chain    | 
+--------------------+-------+-----------------+-------+--------------------+ 
| 82     | 408 |RT2    |0000 |null/RT1/RT2  | 
| 42     | 408 |RT3    |0000 |null/RT1/RT2/RT3 | 
| 18     | 408 |RT4    |0000 |null/RT1/RT2/RT3/RT4| 
| 2191    | 408 |RT1    |0000 |null/RT1   | 
| 2     | 142 |RT1    |0000 |null/RT1   | 
| 1     | 142 |RT2    |0000 |null/RT1/RT2  | 
| 1     | 408 |RT1    |HFOTA1 |null/RT1   | 
| 1     | 408 |RT1    |HFOTA2 |null/RT1   | 
| 1     | 408 |RT1    |HFOTA3 |null/RT1   | 
| 1     | 408 |RT1    |HFOTA4 |null/RT1   | 
| 1     | 408 |RT1    |HFOTA5 |null/RT1   | 
+--------------------+-------+-----------------+-------+--------------------+ 

實際返回的結果:

我試圖使用查詢來生成基於firmware_version和image_prerequisite的鏈,但它沒有按預期返回結果。此查詢返回更多的記錄。

/RT1 RT1 2109 408 0000000000000000  2990 
/RT1/RT2 RT2 40 408 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1/RT2 RT2 1 1422 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1 RT1 1 408 HFOTA-0000001885  2990 
/RT1/RT2 RT2 40 408 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1/RT2 RT2 1 1422 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1 RT1 1 408 HFOTA-0000000041  2990 
/RT1/RT2 RT2 40 408 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1/RT2 RT2 1 1422 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1 RT1 1 408 HFOTA-0000000441  2990 
/RT1/RT2 RT2 40 408 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1/RT2 RT2 1 1422 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1 RT1 1 408 HFOTA-0000000359  2990 
/RT1/RT2 RT2 40 408 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1/RT2 RT2 1 1422 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1 RT1 1 408 HFOTA-0000000334  2990 
/RT1/RT2 RT2 40 408 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1/RT2 RT2 1 1422 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1 RT1 1 1422 0000000000000000  2990 
/RT1/RT2 RT2 40 408 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 
/RT1/RT2 RT2 1 1422 0000000000000000 RT1 125 
/RT1/RT2/RT3 RT3 24 408 0000000000000000 RT2 42 
/RT1/RT2/RT3/RT4 RT4 18 408 0000000000000000 RT3 18 

從存儲在sqlfiddle數據預期結果:http://sqlfiddle.com/#!4/3cd9b/1

|/RT1/RT2/RT3/RT4| RT4  | 18 | 408| 0000000000000000| 24028| 18| 
|/RT1/RT2/RT3 | RT3  | 24 | 408| 0000000000000000| 24028| 42| 
|/AP1/AP2/AP3 | AP3  | 1 | 408| 0000000000000000| 24028| 1 | 
|/RT1/RT2  | RT2  | 40 | 408| 0000000000000000| 24028| 82| 
|/AP1/AP2  | AP2  | 2 | 408| 0000000000000000| 2 | 3 | 
|/AP1   | AP1  | 1 | 408| 0000000000000000| 1 | 4 | 
|/RT1   | RT1  |2109| 408| 0000000000000000| 24028|2191| 
|/AS1   | AS1  | 1 | 408| 0000000000000000| 24028| 1 | 
|/LRA1.NOV9.01 |LRA1.NOV9.01| 2 | 408| 0000000000000002| 106 | 2 | 
|/LRA001   | LRA001 | 9 | 408| 0000000000000002| 106 | 9 | 
|/LR1R_01  | LR1R_01 |15 | 408| 0000000000000002| 106 | 15| 
|/APK29.2013  |APK29.2013 | 4 | 408| 0000000000000002| 106 | 4 | 
|/APK2013.29  |APK2013.29 | 2 | 408| 0000000000000002| 106 | 2 | 
|/ADR_TLRA1  |ADR_TLRA1 | 2 | 408| 0000000000000002| 106 | 2 | 
|/ADR37   |ADR37  | 1 | 408| 0000000000000002| 106 | 1 | 
|/A0    |A0   | 5 | 408| 0000000000000002| 106 | 5 | 
|/36    |36   | 2 | 408| 0000000000000002| 106 | 2 | 
|/LRA1_K01  |LRA1_K01 | 2 | 408| 0000000000000002| 106 | 2 | 
|/abc   |abc   | 5 | 408| 0000000000000002| 106 | 5 | 
|/VZW_U01  |VZW_U01  | 1 | 408| 0000000000000002| 106 | 1 | 
|/VZW.NOV9.01 |VZW.NOV9.01 | 1 | 408| 0000000000000002| 106 | 1 | 
|/TOSS_01  |TOSS_01  | 1 | 408| 0000000000000002| 106 | 1 | 
|/TK_ST001  |TK_ST001 | 1 | 408| 0000000000000002| 106 | 1 | 
|/SVP01   |SVP01  | 1 | 408| 0000000000000002| 106 | 1 | 
|/LRA1v1   |LRA1v1  | 1 | 408| 0000000000000002| 106 | 1 | 
|/LRA2_R01  |LRA2_R01 | 2 | 408| 0000000000000002| 106 | 2 | 
|/MMY02-2013  |MMY02-2013 | 3 | 408| 0000000000000002| 106 | 3 | 
|/PP0_MR1  |PP0_MR1  | 1 | 408| 0000000000000002| 106 | 1 | 
|/RT1   |RT1   | 1 | 408| HFOTA-0000000041| 1 | 1 | 
|/RT1   |RT1   | 1 | 408| HFOTA-0000000334| 2 | 1 | 
|/RT1   |RT1   | 1 | 408| HFOTA-0000000359| 1 | 1 | 
|/RT1   |RT1   | 1 | 408| HFOTA-0000000441| 1 | 1 | 
|/RT1   |RT1   | 1 | 408| HFOTA-0000001885| 2 | 1 | 
|/RT1/RT2  |RT2   | 1 | 1422| 0000000000000000| 7 | 1 | 
|/RT1   |RT1   | 1 | 1422| 0000000000000000| 7 | 2 | 
+0

查詢中有CHARGING_GROUP_ID列,但表中沒有這樣的列。 – krokodilko

+0

@krokodilko請幫助解決累積計數問題。 –

+0

@ASaraf,是爲你工作還是不是?如果是,請將答案標記爲已接受(就像在stackoverflow.com上的常見行爲一樣)。 – nop77svk

回答

0

單獨與試錯在你的SQL小提琴樣本數據,這是查詢返回的預期數據:

SELECT SYS_CONNECT_BY_PATH(firmware_version, '/') path_, 
    firmware_version, 
    device_count, 
    dmc_id, 
    charging_group_id, 
    IMAGE_PREREQUISITE, 
    (SELECT SUM(device_count) 
    FROM DM_TEMP_SUMMING_DVC_BY_FW t2 
    START WITH t1.firmware_version = t2.firmware_version 
     and T1.dmc_id = T2.dmc_id 
     and T1.charging_group_id = T2.charging_group_id 
    CONNECT BY nocycle PRIOR firmware_version=image_prerequisite and prior dmc_id = dmc_id and prior charging_group_id = charging_group_id 
) sum_device 
FROM DM_TEMP_SUMMING_DVC_BY_FW t1 
START WITH image_prerequisite IS NULL 
CONNECT BY nocycle PRIOR firmware_version = image_prerequisite 
    and prior dmc_id = dmc_id 
    and prior charging_group_id = charging_group_id 

注意:是的,charging_group_iddmc_id是非常重要的你的預期的結果,正如krokodilko在他上面的評論中正確提到的那樣。