SQL仅返回条件下的特定行

时间:2014-11-03 20:54:11

标签: sql-server tsql join

我有以下查询;

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'等。

因此需要输出如果在Table应用程序中找到的记录,如果没有找到则返回ApplicationGroup AG4,如果没有找到,则返回AG3,依此类推。


在我原来的问题中,我可能还不够清楚。

  1. 我有一个applicationGroups的层次结构AG1 = Parent,AG2 AG1的AG1,AG3的AG3 Child,AG3的AG4 Child。这由孩子的父REFSTR = BELONGSTO处理。

  2. 我有一个链接到AG4组的应用程序,链接在表关系中处理。所以application.REFSTR = Relation.FROMREF和AG4.REFSTR = Relation.TOREF。

  3. 在这些对象A,AG1,AG2,AG3,AG4中的每一个上,我可以分配一个责任(BC协调员),它是对人的参考。这在表ROLE中处理,因此OBJECT引用应用程序A或其中一个ApplicationGroups(AG1,AG2,AG3,AG4),然后引用Person over ROLE.RESPONSIBLE = PERSON.REFSTR。这里的最后一个连接是ROLETYPE.REFSTR = ROLE.ROLETYPE,它将(BC协调器)控制为一个特定的RoleType。这个责任分配在任何级别都可以是1-1或1-n。

  4. 要求如下;

    1. 如果责任(BC协调员)的分配(如果存在的话),我需要从应用程序A开始,然后给我所有拥有1或多个人的人。

    2. 如果在应用程序中找不到任何内容,请查看分配了应用程序A的ApplicationGroup AG4。再一次或多次。

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

    4. 如果在ApplicationGroup AG3上找不到任何内容,请查看其Parent ApplicationGroup AG2。

    5. 如果在ApplicationGroup AG2上找不到任何内容,请查看其Parent ApplicationGroup AG1。

    6. 如果仍未发现任何结果,则无结果。

    7. 我遇到的问题是从一个级别到另一个级别的这个逻辑,至于我以前的评论使用此查询的TOP 1如果只是总是得到1个结果将起作用,但是这可能在任何级别都有很多结果

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

将REFSTR创建为表

如果存在则使用(对所有情况都这样做)

如果存在(选择*

来自REFSTR的

其中xxx喜欢'% - A')

然后

开始

选择*

来自REFSTR的

其中xxx喜欢'% - a'

否则......(案例-AG4)

答案 2 :(得分: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)**