2014-10-17 25 views
0

喜在CASE表達式,其中返回多行一subquery,它給錯誤說subquery returns more than one row但我subquery總是會返回超過1越來越需要的所有fetch查詢返回的行。案例表達錯誤時,子查詢返回不止一個錯誤

你能幫我調整查詢嗎?

SELECT TS.ts_test_id "TEST ID", 
    TS.ts_name "TEST NAME", 
    TS.ts_responsible "Designer", 
    DS.ds_step_order "Step Order", 
    DS.ds_step_name "Step Name", 
    TS.TS_USER_02 "Application", 
    CASE 
     WHEN DS.ds_link_test is NULL THEN DS.ds_description 
     ELSE 
      CASE 
       WHEN DS_LN.ds_link_test is NULL THEN DS_LN.ds_description 
       ELSE 
        **(SELECT ds_description from DESSTEPS where ds_test_id = DS_LN.ds_link_test)** 
      END 
    END "Step Description", 
    CASE 
     WHEN DS.ds_link_test is NULL THEN DS.ds_expected 
     ELSE 
      CASE 
       WHEN DS_LN.ds_link_test is NULL THEN DS_LN.ds_expected 
       ELSE 
        **(SELECT ds_expected from DESSTEPS where ds_test_id =DS_LN.ds_link_test)** 
      END 
    END "Expected Result" 
FROM dessteps DS 
    LEFT JOIN dessteps DS_LN ON DS_LN.ds_test_id = DS.ds_link_test 
    JOIN test TS ON DS.ds_test_id = TS.ts_test_id 
     AND TS.TS_USER_02 = 'ABINRIM' --CHANGE THE APP NAME 
ORDER BY DS.ds_step_order 
+0

您可以發佈一些示例數據和您試圖創建的輸出嗎?另外,你使用的是什麼數據庫/ SQL版本? – mlinth 2014-10-17 08:16:24

+0

我其實我在質量中心數據庫執行這個查詢主要是oracle。用星號加亮的Select查詢返回兩行或更多行。功能性是有兩個表Test和DESSTPES。對於每個TEST表,在DESTEPS TABLE中可能有多行,並且可能存在TEST表的鏈接。當一個測試有一個設計步驟,這反過來又要求另一個設計步驟,並且設計步驟可能會導致另一個步驟,這個鏈接就是這樣的。 – Ramya 2014-10-17 08:44:04

回答

0

好的 - 我不明白你在做什麼,以便給你100%的答案,但是select中的子查詢不起作用; select語句將只接受單個值,而不接受行。我認爲你的案件陳述中也有你的表格混淆 - 我已經試着將它們固定在下面。一小塊語義:我要調用一個自連接,即當你將表連接到它自己時,「遞歸步驟」)。

您是否有可變數量的遞歸步驟,或者您是否知道有多少次必須使用DESTEPS自行加入?無論哪種方式,您可能會發現一個優雅的解決方案與遞歸查詢 - 我不熟悉Oracle,所以我不能幫你在那裏,但例如, this link might help you

或者,如果您知道遞歸步驟的數量,則可以多次自我連接。例如。

SELECT TS.ts_test_id "TEST ID", 
TS.ts_name "TEST NAME", 
TS.ts_responsible "Designer", 
DS.ds_step_order "Step Order", 
DS.ds_step_name "Step Name", 
TS.TS_USER_02 "Application", 
CASE 
    WHEN DS_LN.ds_link_test is NULL THEN DS.ds_description 
    ELSE 
     CASE 
      WHEN ds2.ds_link_test is NULL THEN DS_LN.ds_description 
      ELSE 
       ds2.ds_description 
     END 
END "Step Description", 
CASE 
    WHEN DS_LN.ds_link_test is NULL THEN DS.ds_expected 
    ELSE 
     CASE 
      WHEN ds2.ds_link_test is NULL THEN DS_LN.ds_expected 
      ELSE 
       ds2.ds_expected 
     END 
END "Expected Result" 
FROM dessteps DS 
    LEFT JOIN dessteps DS_LN ON DS_LN.ds_test_id = DS.ds_link_test 
    JOIN test TS ON DS.ds_test_id = TS.ts_test_id 
    LEFT JOIN dessteps ds2 ON ds2.ds_test_id = DS_LN.ds_link_test 

    AND TS.TS_USER_02 = 'ABINRIM' --CHANGE THE APP NAME 
ORDER BY DS.ds_step_order 
+0

此查詢實際上不起作用,因爲它在不替換遞歸步驟的情況下獲取所有記錄。 – Ramya 2014-10-17 16:34:28

+0

就是這樣 - 你沒有說出你想要的輸出,最好是有幾行樣本。上面的查詢產生一個輸出 - 每一步一行。你想每一步只有一行嗎?然後,你需要編寫一個查詢來聚合你的步驟,並加入到... – mlinth 2014-10-18 13:45:55