2014-11-03 67 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