2014-11-03 69 views
0

我有以下查詢;SQL根據條件僅返回特定行

SELECT DISTINCT CASE 
        WHEN ROLE.OBJECT = A.REFSTR THEN P.REFSTR + '-A' 
        WHEN ROLE.OBJECT = AG4.REFSTR THEN P.REFSTR + '-AG4' 
        WHEN ROLE.OBJECT = AG3.REFSTR THEN P.REFSTR + '-AG3' 
        WHEN ROLE.OBJECT = AG2.REFSTR THEN P.REFSTR + '-AG2' 
        WHEN ROLE.OBJECT = AG1.REFSTR THEN P.REFSTR + '-AG1' 
       END AS REFSTR 
FROM APPLICATIONGROUP AG1 
     JOIN APPLICATIONGROUP AG2 
     ON AG2.BELONGSTO = AG1.REFSTR 
     JOIN APPLICATIONGROUP AG3 
     ON AG3.BELONGSTO = AG2.REFSTR 
     JOIN APPLICATIONGROUP AG4 
     ON AG4.BELONGSTO = AG3.REFSTR 
     JOIN RELATIONS R 
     ON R.TOREF = AG4.REFSTR 
      AND R.PROPERTY = 'ApplicationGroups' 
     JOIN APPLICATION A 
     ON A.REFSTR = R.FROMREF 
     JOIN ROLE 
     ON ROLE.OBJECT = A.REFSTR 
      OR ROLE.OBJECT = AG1.REFSTR 
      OR ROLE.OBJECT = AG2.REFSTR 
      OR ROLE.OBJECT = AG3.REFSTR 
      OR ROLE.OBJECT = AG4.REFSTR 
     JOIN ROLETYPE RT 
     ON RT.REFSTR = ROLE.ROLETYPE 
      AND RT.NAME = 'BC Coordinator' 
     JOIN PERSON P 
     ON P.REFSTR = ROLE.RESPONSIBLE 
WHERE A.REFSTR = '326-1480-0' 

它給我下面的記錄返回;

REFSTR 
273-1123-0-A 
273-18075-0-AG4 
273-26853-0-AG3 
273-27196-0-AG2 
273-3235-0-AG1 

我在找的是一種只顯示第一條記錄的方法,如果它存在的話; 如果選擇記錄'%A',則只顯示'%A',如果沒有顯示記錄'%A',則顯示'%AG4'等。

所以需要輸出記錄,如果找不到表格應用程序,如果找不到,那麼ApplicationGroup AG4如果找不到,那麼AG3等等。


一個更新,因爲也許我在我原來的問題不夠清楚。

  1. 我有一個應用程序組的等級AG1 =父母,AG2孩子AG1,AG3孩子AG2,AG4孩子AG3。這是由孩子的父母REFSTR = BELONGSTO處理的。

  2. 我有一個鏈接到AG4組的應用程序,在表關係中處理鏈接。所以application.REFSTR = Relation.FROMREF和AG4.REFSTR = Relation.TOREF。

  3. 在這些對象A,AG1,AG2,AG3,AG4中的每一個上,我都可以分配一個責任(BC協調員),這是一個對某人的引用。這在表ROLE中處理,因此OBJECT引用應用程序A或其中一個應用程序組(AG1,AG2,AG3,AG4),然後引用ROLE上的Person.RESPONSIBLE = PERSON.REFSTR。這裏的最後一個連接是ROLETYPE.REFSTR = ROLE.ROLETYPE,它將(BC協調員)控制爲一個特定的RoleType.責任的分配可以是1-1或1-n在任何級別。

要求如下;

  1. 我需要的都開始於應用程序A,如果責任(BC協調員)的分配如果存在的話那就給我誰擁有這1個或多個的所有人員。

  2. 如果在應用程序中找不到任何內容,請查看應用程序A分配到的ApplicationGroup AG4。再次是1或很多。

  3. 如果在ApplicationGroup AG4上找不到任何內容,請查看其父ApplicationGroup AG3。

  4. 如果在ApplicationGroup AG3上找不到任何內容,請查看其父應用程序組AG2。

  5. 如果在ApplicationGroup AG2上找不到任何內容,請查看其父應用程序組AG1。

  6. 如果仍然沒有發現,則沒有結果。

我遇到的問題是這個邏輯從一個層次到另一個,因爲我之前的評論使用此查詢,如果它只是始終得到1周的結果將工作的頭等1,但是這可能是很多結果在任何級別。

回答

0

我能夠使用以下來自同事的代碼解決問題:非常感謝提示。

 WITH TMP AS(

SELECT DISTINCT CASE  
     WHEN ROLE.OBJECT = A.REFSTR THEN P.REFSTR 
     WHEN ROLE.OBJECT = AG4.REFSTR THEN P.REFSTR 
     WHEN ROLE.OBJECT = AG3.REFSTR THEN P.REFSTR 
     WHEN ROLE.OBJECT = AG2.REFSTR THEN P.REFSTR 
     WHEN ROLE.OBJECT = AG1.REFSTR THEN P.REFSTR 
       END AS REFSTR, 
       CASE  
     WHEN ROLE.OBJECT = A.REFSTR THEN '1' 
     WHEN ROLE.OBJECT = AG4.REFSTR THEN '2' 
     WHEN ROLE.OBJECT = AG3.REFSTR THEN '3' 
     WHEN ROLE.OBJECT = AG2.REFSTR THEN '4' 
     WHEN ROLE.OBJECT = AG1.REFSTR THEN '5' 
       END AS LEVEL 
    FROM APPLICATIONGROUP AG1 
    JOIN APPLICATIONGROUP AG2 ON 
    AG2.BELONGSTO = AG1.REFSTR 
    JOIN APPLICATIONGROUP AG3 ON 
    AG3.BELONGSTO = AG2.REFSTR 
    JOIN APPLICATIONGROUP AG4 ON 
    AG4.BELONGSTO = AG3.REFSTR 
    JOIN RELATIONS R ON 
    R.TOREF = AG4.REFSTR AND R.PROPERTY = 'ApplicationGroups' 
    JOIN APPLICATION A ON 
    A.REFSTR = R.FROMREF 
    JOIN ROLE ON 
    ROLE.OBJECT = A.REFSTR OR 
    ROLE.OBJECT = AG1.REFSTR OR 
    ROLE.OBJECT = AG2.REFSTR OR 
    ROLE.OBJECT = AG3.REFSTR OR 
    ROLE.OBJECT = AG4.REFSTR 

    JOIN ROLETYPE RT ON 
    RT.REFSTR = ROLE.ROLETYPE AND RT.NAME = 'BC Coordinator' 
    JOIN PERSON P ON 
    P.REFSTR = ROLE.RESPONSIBLE 


    WHERE A.REFSTR = '326-1480-0') 

**SELECT REFSTR FROM TMP 
GROUP BY REFSTR,LEVEL 
HAVING LEVEL = (SELECT MIN(LEVEL) FROM TMP)** 
0

在黑暗中的一種鏡頭,但也許是這樣的?

SELECT TOP 1 
    P.REFSTR + '-A' + 
    CASE  
     WHEN r.OBJECT = AG4.REFSTR THEN P.REFSTR + 'G4' 
     WHEN r.OBJECT = AG3.REFSTR THEN P.REFSTR + 'G3' 
     WHEN r.OBJECT = AG2.REFSTR THEN P.REFSTR + 'G2' 
     WHEN r.OBJECT = AG1.REFSTR THEN P.REFSTR + 'G1' 
    END AS REFSTR 
FROM APPLICATIONGROUP AG1 
JOIN APPLICATIONGROUP AG2 ON AG2.BELONGSTO = AG1.REFSTR 
JOIN APPLICATIONGROUP AG3 ON AG3.BELONGSTO = AG2.REFSTR 
JOIN APPLICATIONGROUP AG4 ON AG4.BELONGSTO = AG3.REFSTR 
JOIN RELATIONS R ON R.TOREF = AG4.REFSTR AND R.PROPERTY = 'ApplicationGroups' 
JOIN APPLICATION A ON A.REFSTR = R.FROMREF 
JOIN ROLE R ON r.OBJECT = A.REFSTR OR r.OBJECT = AG1.REFSTR OR r.OBJECT = AG2.REFSTR OR r.OBJECT = AG3.REFSTR OR r.OBJECT = AG4.REFSTR 
JOIN ROLETYPE RT ON RT.REFSTR = r.ROLETYPE AND RT.NAME = 'BC Coordinator' 
JOIN PERSON P ON P.REFSTR = r.RESPONSIBLE 
WHERE A.REFSTR = '326-1480-0' 
ORDER BY CASE 
    WHEN R.OBJECT = A.REFSTR THEN 1 
    WHEN R.OBJECT = AG4.REFSTR THEN 2 
    WHEN R.OBJECT = AG3.REFSTR THEN 3 
    WHEN R.OBJECT = AG2.REFSTR THEN 4 
    WHEN R.OBJECT = AG1.REFSTR THEN 5 
END 
+0

感謝TOP1得到我,我找然而所有這些類別的結果可能有多個,我需要所有的人,所以如果2個記錄來,爲要接2,如果沒有A和2 AG4然後從AG4的2 – RobertE 2014-11-03 21:35:50

+0

這種矛盾你在你的問題中陳述。似乎你需要提供更多的解釋。 – 2014-11-03 22:40:35

+0

嗨,請看我的主要問題,我希望它更清晰。 – RobertE 2014-11-04 07:10:48

0

如果存在(這樣做對所有的情況下)

如果存在(選擇*

從REFSTR

其中xxx LIKE'%創建REFSTR如表

使用 - A')

then

開始

SELECT *

從REFSTR

其中xxx LIKE '% - 一個'

否則......(情況-AG4)

+1

謝謝,主要問題是在軟件中,我只能用(作爲xxx)或(選擇) – RobertE 2014-11-04 11:06:59

+0

WITH xxx作爲(您的查詢)選擇(我的查詢)開始查詢。 – 2014-11-04 11:19:53