我有以下查询;
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,依此类推。
在我原来的问题中,我可能还不够清楚。
我有一个applicationGroups的层次结构AG1 = Parent,AG2 AG1的AG1,AG3的AG3 Child,AG3的AG4 Child。这由孩子的父REFSTR = BELONGSTO处理。
我有一个链接到AG4组的应用程序,链接在表关系中处理。所以application.REFSTR = Relation.FROMREF和AG4.REFSTR = Relation.TOREF。
在这些对象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。
要求如下;
如果责任(BC协调员)的分配(如果存在的话),我需要从应用程序A开始,然后给我所有拥有1或多个人的人。
如果在应用程序中找不到任何内容,请查看分配了应用程序A的ApplicationGroup AG4。再一次或多次。
如果在ApplicationGroup AG4上找不到任何内容,请查看其父ApplicationGroup AG3。
如果在ApplicationGroup AG3上找不到任何内容,请查看其Parent ApplicationGroup AG2。
如果在ApplicationGroup AG2上找不到任何内容,请查看其Parent ApplicationGroup AG1。
如果仍未发现任何结果,则无结果。
我遇到的问题是从一个级别到另一个级别的这个逻辑,至于我以前的评论使用此查询的TOP 1如果只是总是得到1个结果将起作用,但是这可能在任何级别都有很多结果
答案 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)**