2013-02-26 39 views
1

下面是一个示例数据:从此表中,如果stringvalue包含或等于ID,则基于满足的条件获取代码,并使用stringvalue检查ID。如果至少有1个满足条件,则查询将连接代码的任何值并将其置于新代码之下。STUFF和Oracle11g查询中的XML路径

Scenario 1 
    ID   CODE  VALUE    Newcode 
    4   42        44,45 
    4   43        44,45 
    4   44   2,4,6    44,45 
    4   45   2,4,6    44,45 

Scenario 2 

ID  CODE   VALUE    Newcode 
4   42      44 
4   43      44 
4   44   4   44 
4   45   3   44 

回答

0

只需使用list_agg

select sub.mainid, list_agg(cast(sub_code as nvarchar(100)), ',') 
from ENPTREEATTRS SUB 
WHERE SUB.CODE in ('42','43','44','45') and 
     SUB.STRINGVALUE LIKE '%'||cast(id as nvarchar(100))||'%' 
group by sub.mainid 

顺便说一句,你不应该在SQL Server中使用convert(nvarchar, id)。您应该始终提供一个长度,例如convert(nvarchar(100), id)

+0

得到一个缺少右括号但我检查它是完整的。 – Rogbi 2013-02-26 02:59:19

+0

@Rogbi。 。 。那么,这个查询并不完全一样,因为where子句中的关联。但是再一次,原始查询不是完整的查询。这只是显示解决问题的策略,但它不是一个完整的查询。 – 2013-02-26 03:04:10

+0

我认为这不适合我。我发布的sql查询只在select语句中,并且我有很多要在主FROM语句中加入的表。 – Rogbi 2013-02-26 03:17:52

0

根据您的更新,你应该能够使用子查询来获取列表数据,然后加入该回你的表:

SELECT DISTINCT 
    ID, 
    CODE, 
    ATTRSTRINGVALUE, 
    SUB.Newcode 
FROM Table1 A 
INNER JOIN tabel2 b 
    ON a.MainID = b.mainID 
LEFT JOIN 
(
    SELECT SUB.MainID, 
    list_agg(cast(SUB.CODE as nvarchar2(50)), ',') as Newcode 
    FROM ENPTREEATTRS SUB 
    WHERE SUB.CODE in ('42','43','44','45') 
    AND SUB.STRINGVALUE LIKE '%'||cast(ID as nvarchar2(50))||'%' 
    GROUP BY SUB.MainID 
) SUB 
    ON SUB.MainID = A.MainID 

编辑#1,您张贴您可以在新的查询后,用途:

SELECT DISTINCT 
    ID, 
    CODE, 
    ATTRSTRINGVALUE, 
    SUB.Newcode 
FROM ENPBATREE A 
LEFT OUTER JOIN enptreeattrs B on A.MainID = B.MainID 
LEFT OUTER JOIN ENPTREEATTRS B1 on B.MainID = B1.MainID 
LEFT OUTER JOIN ENPTREEATTRS B2 on B1.MainID = B2.MainID 
LEFT OUTER JOIN ENPENTRYACCESSUSERSROLES D on B2.MainID = D.MainID 
LEFT OUTER JOIN ENPENTRYACCESSLIST F on D.USERNAME = F.USERNAME 
LEFT JOIN 
(
    SELECT SUB.MainID, 
    list_agg(cast(SUB.CODE as nvarchar2(50)), ',') as Newcode 
    FROM ENPTREEATTRS SUB 
    WHERE SUB.CODE in ('42','43','44','45') 
    AND SUB.STRINGVALUE LIKE '%'||cast(ID as nvarchar2(50))||'%' 
    GROUP BY SUB.MainID 
) SUB 
    ON SUB.MainID = A.MainID 

您可能能够在没有子查询执行此:

SELECT 
    A.TREEENTRYID, 
    F.accessid, 
    b1.ATTRID, 
    b1.attrstringvalue, 
    list_agg(cast(SUB.ATTRID as nvarchar2(50)), ',') as Newcode 
FROM ENPBATREE A 
LEFT OUTER JOIN enptreeattrs B on A.TREEENTRYID = B.TREEENTRYID 
LEFT OUTER JOIN ENPTREEATTRS B1 on B.TREEENTRYID = B1.TREEENTRYID 
LEFT OUTER JOIN ENPTREEATTRS B2 on B1.TREEENTRYID = B2.TREEENTRYID 
LEFT OUTER JOIN ENPENTRYACCESSUSERSROLES D on B2.TREEENTRYID = D.TREEENTRYID 
LEFT OUTER JOIN ENPENTRYACCESSLIST F on D.USERNAME = F.USERNAME 
LEFT JOIN enptreeattrs SUB 
    ON SUB.MainID = A.MainID 
WHERE SUB.ATTRID in ('42','43','44','45') 
    AND SUB.ATTRSTRINGVALUE LIKE '%'||cast(F.ACCESSID as nvarchar2(50))||'%' 
GROUP BY A.TREEENTRYID, F.ACCESSID, 
    b1.ATTRID, b1.attrstringvalue; 

SELECT 
    ID, 
    CODE, 
    ATTRSTRINGVALUE, 
    list_agg(cast(SUB.CODE as nvarchar2(50)), ',') as Newcode 
FROM ENPBATREE A 
LEFT OUTER JOIN enptreeattrs B on A.MainID = B.MainID 
LEFT OUTER JOIN ENPTREEATTRS B1 on B.MainID = B1.MainID 
LEFT OUTER JOIN ENPTREEATTRS B2 on B1.MainID = B2.MainID 
LEFT OUTER JOIN ENPENTRYACCESSUSERSROLES D on B2.MainID = D.MainID 
LEFT OUTER JOIN ENPENTRYACCESSLIST F on D.USERNAME = F.USERNAME 
LEFT JOIN ENPTREEATTRS SUB 
    ON SUB.MainID = A.MainID 
WHERE SUB.CODE in ('42','43','44','45') 
    AND SUB.STRINGVALUE LIKE '%'||cast(ID as nvarchar2(50))||'%' 
GROUP BY ID, CODE, ATTRSTRINGVALUE 

+0

只是更新连接,我不能去哪里把我的oracle查询的子查询? – Rogbi 2013-02-26 03:53:22

+0

@Rogbi您可以将其作为最后的加入。看我的编辑。 – Taryn 2013-02-26 03:55:48

+0

我在“AND SUB.STRINGVALUE LIKE'%'|| cas​​t(ID为nvarchar2(50))||'%'” – Rogbi 2013-02-26 03:58:27