我正在學習Oracle SQL,並且遇到了與當前查詢有關的問題。我正在處理幾個VIEW,這些VIEW是一對多的關係。Oracle從衆多JOIN中選擇一對多返回重複項
我得到了LISTAGG查詢的工作,這很好。
現在,我增加了一對多VIEW_PHONE到我的查詢。
我試着看着樞軸,但我得到了一點失落。我發現這個查詢使用Max,Case並且它自己可以工作。當我爲合併
個人,企業和家庭電話號碼的電話Case語句,結果有重複技巧串。
這裏是輸出
之前添加VIEW_PHONE
1 John M. Doe JDOE 1:1, 2:2, 3:3, 4:4
添加VIEW_PHONE內加入
1 John M. Doe JDOE 111-111-1111, 222-222-2222, 333-333-3333, 1;1, 1:1, 1:1, 2:2,2:2,2:2, 3:3, 3:3, 3:3, 4:4,4:4,4:4
我注意到,如果我改變內部連接語句PHONE.PHONE_TYPE(家庭之後','BUSINESS','CELL')改爲PHONE.PHONE_TYPE('HOME'),它只會給出一個技能字符串,而不是3.由於我正在嘗試獲取3個電話號碼,因此影響了我與第e VIEW_SKILL。
如何解決此查詢不重複技能字符串。謝謝..
SELECT PERSON.PERSON_ID, PERSON.FIRST_NAME, PERSON.MIDDLE_NAME, PERSON.LAST_NAME,
PERSON.USER_NAME,
max(case when PHONE_TYPE = 'HOME' then PHONE_NUMBER end) as HOME_PHONE,
max(case when PHONE_TYP= 'BUSINESS' then PHONE_NUMBER end) as BUSINESS_PHONE,
max(case when PHONE_TYP= 'CELL' then PHONE_NUMBER end) as CELL_PHONE,
LISTAGG(case when SKILLS.SKILL_DESC = '1' then '1:1'
when SKILLS.SKILL_DESC = '2' then '2:2'
when SKILLS.SKILL_DESC = '3' then '3:3'
when SKILLS.SKILL_DESC = '4' then '4:4'
when SKILL_DESC = 'ADMIN' AND PERSON.DEPT= 'DEPT1' then 'DEPT1:ADMIN'
when SKILL_DESC = 'ADMIN' AND PERSON.DEPT= 'DEPT2' then 'DEPT2:ADMIN'
else ''
end, ',') WITHIN GROUP (ORDER BY SKILLS.SKILL_SHORT_DESC) AS Speciality
FROM VIEW_PERSON PERSON INNER JOIN
(SELECT DISTINCT PERSON_ID, PHONE_TYPE, PHONE_NUMBER FROM VIEW_PHONE
) PHONE
ON PHONE.PERSON_ID = PERSON.PERSON_ID AND PHONE.PHONE_TYPE('HOME', 'BUSINESS', 'CELL') LEFT JOIN
(SELECT DISTINCT PERSON_ID, SKILL_SHORT_DESC
FROM EPERSON.VIEW_UDRMS_PERSON_SKILL
) SKILLS
ON SKILLS.PERSON_ID = PERSON.PERSON_ID
GROUP BY PERSON.PERSON_ID, PERSON.FIRST_NAME, PERSON.MIDDLE_NAME, PERSON.LAST_NAME, PERSON.USER_NAME
似乎是從[這個問題]的後續(http://stackoverflow.com/questions/38513561/oracle-select-query-for-one-to-many-relationship-between-two-tables/38516352 #385163520)。 – Unoembre
在連接之前(而不是DISTINCT)在派生表中執行LISTAGG,並且對於MAX(CASE)也是類似的。 – dnoeth