Oracle'da Column yani kolon veya kolonlar içerisindeki verileri tek satırda göstermek istediğimiz zaman XMLAGG, XMLELEMENT, EXTRACT komutlarını kullanırız. Bunu kullanmamızın amacı bazı Join yaptığımız kolonlarda ortak ID'lerin birden fazla farklı verisi olabilir, Bunları tek satırda görme ihtiyacı duyabiliriz. Örnek ile HR Schema üzerinde anlatacak olursak;
HR.EMPLOYEES ve HR.DEPARTMENTS tablolarında DEPARTMENT_ID kolonu ortak olup bunları JOIN'leriz. Daha JOIN'lenen Datalar da DEPARTMENT_ID bilgisi aynı fakat SALARY bilgisi farklı olan Dataları MAASLAR kolonu içinde tek Row'da göstermeye çalışırız. Sonuç aşağıdaki sorgu gibi olmalıdır.
SELECT DEPARTMENT_ID,
(SELECT RTRIM(XMLAGG (XMLELEMENT (e, T.SALARY ||','))
.EXTRACT( '//text()'),
',')
FROM HR.EMPLOYEES T
WHERE T.DEPARTMENT_ID = S.DEPARTMENT_ID) AS MAASLAR
FROM HR.DEPARTMENTS S
ORDER BY DEPARTMENT_ID ASC
Bunun dışında HR.DEPARTMENTS tablosu içinde LOCATION_ID kolonundaki bilgileri tek Row'da göstermek istediğimizde; (Ayrıca 5 veriden altını göstermesi için WHERE ROWNUM < 5 şartını ekleyebilirsiniz)
SELECT RTRIM (
XMLAGG (XMLELEMENT (e, LOCATION_ID, ',').EXTRACT ('//text()')),',')
LOCATION_ID FROM HR.DEPARTMENTS
--WHERE ROWNUM < 5;
2) Sayısal Veri Üzerinde İşlem Yapmak
SELECT EMP.EMPLOYEE_ID AS ID,
EMP.LAST_NAME AS SOYAD,
DP.DEPARTMENT_NAME,EMP.SALARY
FROM HR.EMPLOYEES EMP LEFT JOIN HR.DEPARTMENTS DP
ON DP.DEPARTMENT_ID = EMP.DEPARTMENT_ID
WHERE EMP.SALARY > (SELECT SalarY FROM HR.EMPLOYEES EE WHERE EE.EMPLOYEE_ID = 200)
SELECT EMP.EMPLOYEE_ID AS ID,
EMP.LAST_NAME AS SOYAD,
DP.DEPARTMENT_NAME,EMP.SALARY
FROM HR.EMPLOYEES EMP LEFT JOIN HR.DEPARTMENTS DP
ON DP.DEPARTMENT_ID = EMP.DEPARTMENT_ID
WHERE EMP.SALARY IN (SELECT SalarY FROM HR.EMPLOYEES EE WHERE EE.EMPLOYEE_ID IN (200,201,202))
Burak AVCI - Update: 07.10.2022
Hiç yorum yok:
Yorum Gönder
Makaleye Yorum ve Sorularınızı Bırakabilirsiniz.