2013-02-26 42 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