38
SQL valodas WITH konstrukcija SQL valodas WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: 1) vaicājumu sadalīt blokos; 2) katram blokam piešķirt nosaukumu; 3) blokus apvienot kopējā vaicājumā. Apakšvaicājumā piešķirtais nosaukums tiek traktēta kā iekļautais skats vai tabula. 1. apakšvaicājums 2. apakšvaicājums 3. apakšvaicājums 1

WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Embed Size (px)

Citation preview

Page 1: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

SQL valodas WITH konstrukcija

SQL valodas WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj:

1) vaicājumu sadalīt blokos;2) katram blokam piešķirt nosaukumu;3) blokus apvienot kopējā vaicājumā.

Apakšvaicājumā piešķirtais nosaukums tiek traktēta kā iekļautais skats vai tabula.

Galvenais vaicājums

1. apakšvaicājums

2. apakšvaicājums

3. apakšvaicājums

1

Page 2: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

WITH konstrukcijas izmantošanas varianti

WITH <Vaicājums1> as (pakārtotais vaicājums1),<Vaicājums2> as (pakārtotais vaicājums2)

SELECT <kolonu nosaukumu saraksts>FROM <Vaicājums1>, <Vaicājums2>WHERE <savienojums>;

WITH Vaicājums1(fun_vert) as (SELECT Funkcija() as fun_vert FROM DUAL)

SELECT fun_vert FROM Vaicājums1;

Rekursija!!!

WITH       Q1 as (SELECT <kolonas> FROM Tabula1   UNION ALL   SELECT <kolonas> FROM Q1, Tabula1 WHERE <saite>)

SELECT <kolonas>FROM Q1;

 

2

Page 3: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

1 Sakne

2 Zars 3 Stumbrs

4 Sakne 5 Lapa

6 Ozols 10 Priede

9 Egle

8 Alksnis7 Osis

12 Persiks

11 Virsis

Tabulas DARBINIEKI izveidošana

create table DARBINIEKI(NUM number Primary key,UZV varchar2(20),ALG number(8,2),DE_NU number,VA_NU number);

begininsert into DARBINIEKI values(1, 'Sakne', 900,1,NULL);insert into DARBINIEKI values(2, 'Zars', 800,1,1);insert into DARBINIEKI values(3, 'Stumrs', 800,1,1);insert into DARBINIEKI values(4, 'Sakne', 600,1,2);insert into DARBINIEKI values(5, 'Lapa', 600,1,2);insert into DARBINIEKI values(6, 'Ozols', 800,2,1);insert into DARBINIEKI values(7, 'Osis', 700,2,6);insert into DARBINIEKI values(8, 'Alksnis', 700,2,6);insert into DARBINIEKI values(9, 'Egle', 700,2,8);insert into DARBINIEKI values(10, 'Priede', 800,3,1);insert into DARBINIEKI values(11, 'Virsis', 700,3,10);insert into DARBINIEKI values(12, 'Persiks', 600,3,11);end;

3

Page 4: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

4

Page 5: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Vaicājums ar WITH konstrukciju, izmantojot tabulu sinonīmus

Darbinieka uzvārda, algas un departamenta kopalgas iegūšana

withDARB_ALGA as (select a.UZV, a.ALG, a.DE_NU

from DARBINIEKI a),

DEP_KOPALGA as (select SUM(b.ALG) Kop_alga, b.DE_NU from DARBINIEKI b group by b.DE_NU)

select c.UZV, c.ALG, d.Kop_algafrom DARB_ALGA c, DEP_KOPALGA dwhere c.DE_NU = d.DE_NU;

with DARB_ALGA as ( SELECT ... ),

DEP_KOPALGA as (SELECT ... )

select ... from DARB_ALGA, DEP_KOPALGA where ...

5

Page 6: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Parametru izmantošana apakšvaicājumos

withDARB_ALGA(UZ, AL,D_NU) as (select UZV, ALG, DE_NU

from DARBINIEKI),

DEP_KOPALGA(KOP, DE_NU) as (select SUM(ALG) Kop_alga, DE_NU

from DARBINIEKI group by DE_NU)

select UZ, AL, KOPfrom DARB_ALGA, DEP_KOPALGAwhere D_NU = DE_NU;

6

Page 8: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Subquery factoring clause1

The subquery_factoring_clause lets you assign a name (query_name) to a subquery block. You can then reference the subquery block multiple places in the query by specifying query_name. Oracle Database optimizes the query by treating the query_name as either an inline view or as a temporary table. The query_name is subject to the same naming conventions and restrictions as database schema objects. The column aliases following the query_name and the set operators separating multiple subqueries in the AS clause are valid and required for recursive subquery factoring. The search_clause and cycle_clause are valid only for recursive subquery factoring but are not required. You can specify this clause in any top-level SELECT statement and in most types of subqueries. The query name is visible to the main query and to all subsequent subqueries. For recursive subquery factoring, the query name is even visible to the subquery that defines the query name itself.

Recursive Subquery FactoringIf a subquery_factoring_clause refers to its own query_name in the subquery that defines it, then the subquery_factoring_clause is said to be recursive. A recursive subquery_factoring_clause must contain two query blocks:

1) the first is the anchor member. The anchor member must appear before the recursive member, and it cannot reference query_name. The anchor member can be composed of one or more query blocks combined by the set operators: UNION ALL, UNION, INTERSECT or MINUS.

2) the second is the recursive member. The recursive member must follow the anchor member and must reference query_name exactly once. You must combine the recursive member with the anchor member using the UNION ALL set operator.

The number of column aliases following WITH query_name and the number of columns in the SELECT lists of the anchor and recursive query blocks must be the same.

Search clause Use the SEARCH clause to specify an ordering for the rows.1. Specify BREADTH FIRST BY if you want sibling rows returned before any child rows are returned.2. Specify DEPTH FIRST BY if you want child rows returned before any siblings rows are returned.3. Sibling rows are ordered by the columns listed after the BY keyword.4. The c_alias list following the SEARCH keyword must contain column names from the column alias list for query_name.5. The ordering_column is automatically added to the column list for the query name. The query that selects from query_name can include an ORDER BY on ordering_column to return the rows in the order that was specified by the SEARCH clause.

1 http://psoug.org/reference/with.html

8

Page 9: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Cycle_clause Use the CYCLE clause to mark cycles in the recursion.1. The c_alias list following the CYCLE keyword must contain column names from the column alias list for query_name. Oracle Database uses these columns to detect a cycle.2. cycle_value and no_cycle_value should be character strings of length 1.3. If a cycle is detected, then the cycle mark column specified by cycle_mark_c_alias for the row causing the cycle is set to the value specified for cycle_value. The recursion will then stop for this row. That is, it will not look for child rows for the offending row, but it will continue for other noncyclic rows.4. If no cycles are found, then the cycle mark column is set to the default value specified for no_cycle_value.5. The cycle mark column is automatically added to the column list for the query_name.6. A row is considered to form a cycle if one of its ancestor rows has the same values for the cycle columns.If you omit the CYCLE clause, then the recursive WITH clause returns an error if cycles are discovered. In this case, a row forms a cycle if one of its ancestor rows has the same values for all the columns in the column alias list for query_name that are referenced in the WHERE clause of the recursive member.

9

Page 10: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

1 Sakne

2 Zars 3 Stumbrs

4 Sakne 5 Lapa

6 Ozols 10 Priede

9 Egle

8 Alksnis7 Osis

12 Persiks

11 Virsis

Tabulas DARBINIEKI

create table DARBINIEKI(NUM number Primary key,UZV varchar2(20),ALG number(8,2),DE_NU number,VA_NU number);

10

Page 11: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Tabulas DEPARTAMENTI izveidošana

create table DEPARTAMENTI(D_NUM number Primary key,D_NOS varchar2(20));

begininsert into DEPARTAMENTI values(1, 'DEP_1');insert into DEPARTAMENTI values(2, 'DEP_2');insert into DEPARTAMENTI values(3, 'DEP_3');end;

1 DEP_1

2 DEP_1 3 DEP_1

4 DEP_1 5 DEP_1

6 DEP_2 10 DEP_3

9 DEP_2

8 DEP_27 DEP_2

12 DEP_3

11 DEP_3

11

Page 12: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Departamentu darbinieku kopējā skaita un algu kopējās summas iegūšana

select D_NOS, COUNT(UZV) Skaits, 0 Alga_kopāfrom DARBINIEKI, DEPARTAMENTIwhere DE_NU = D_NUMgroup by D_NUM, D_NOS

UNION ALL

select D_NOS, 0, SUM(ALG) Alga_kopā from DARBINIEKI, DEPARTAMENTIwhere DE_NU = D_NUMgroup by D_NUM, D_NOS;

12

Page 13: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Departamentu darbinieku algu summa un vidējā visu departamentu darbinieku algu summa

select 'AVG ', 0 D_KOPĀ, AVG(c.D_KOPĀ)from (select b.D_NOS, SUM(a.ALG) D_KOPĀ from DARBINIEKI a, DEPARTAMENTI b where a.DE_NU = b.D_NUM group by b.D_NOS) c

UNION ALL

select e.D_NOS, SUM(d.ALG) D_KOPĀ, 0 from DARBINIEKI d, DEPARTAMENTI e where d.DE_NU = e.D_NUM group by e.D_NOS;

13

Page 14: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Departamenti, kuru darbinieku algu summa ir lielāka vai vienāda ar vidējo departamentu darbinieku algu

WITH DE_IZMAKSAS as ( select DE_NOS, SUM(ALGA) DE_KOPĀ from DARBINIEKI a, DEPARTAMENTI b where a.DE_NUM = b.DE_NUM group by DE_NOS), VID_IZMAKSAS as ( select SUM(DE_KOPĀ)/COUNT(*) VID from DE_IZMAKSAS)

select * from DE_IZMAKSASwhere DE_KOPĀ>= (select VID from VID_IZMAKSAS) order by DE_NOS;

Departamenta nosaukums un darbinieku algu summa.

Vidējā departamentu darbinieku algu summa.

Departamenti, kuru darbinieku algu summa ir lielāka vai vienāda ar vidējo departamentu darbinieku algu summu

14

Page 15: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

1 Sakne

2 Zars 3 Stumbrs

4 Sakne 5 Lapa

6 Ozols 10 Priede

9 Egle

8 Alksnis7 Osis

12 Persiks

11 Virsis

Tabulas DARBINIEKI izveidošana

create table DARBINIEKI(NUM number Primary key,UZV varchar2(20),ALG number(8,2),DE_NU number,VA_NU number);

15

Page 16: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Tabulas DEPARTAMENTI izveidošana

create table DEPARTAMENTI(D_NUM number Primary key,D_NOS varchar2(20));

1 DEP_1

2 DEP_1 3 DEP_1

4 DEP_1 5 DEP_1

6 DEP_2 10 DEP_3

9 DEP_2

8 DEP_27 DEP_2

12 DEP_3

11 DEP_3

16

Page 17: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Rekursija

Rekursija ir process, kurā kaut kādi objekti tiek atkārtoti vai definēti sarežģītākus reducējot uz vienkāršākiem, tos uz vēl vienkāršākiem utt.

Matemātikā un datorzinātnē objektu vai metožu klasei ir rekursīvs raksturs, ja tos var definēt, izmantojot divas īpašības:

1) ir vienkāršs bāzes gadījums (vai gadījumi);2) ir likumu kopa, kas reducē visus citus gadījumus uz bāzes

gadījumu.Piemēram, rekursīva definīcija personas priekštečiem:

1) kāda vecāki ir viņa priekšteči (bāzes gadījums); 2) priekšteči kāda priekštečiem ir arī kāda priekšteči (rekursijas

solis).persona māte (māte ir prieštecis)vecmāte (mātes māte) (prieštecis mātei)vecvecmāte (vecmātes māte) (prieštecis vecmātei)vecvecvecmāte (vecvecmātes māte) (prieštecis vecvecmātei)

Par naturāla skaitļa n ≥ 1 faktoriālu sauc visu naturālo skaitļu no 1 līdz n reizinājumu. To apzīmē ar n!. Piemēram: 3! = 1 · 2 · 3 = 6, 4! = 1 · 2 · 3 · 4 = 24 .Apzīmējumu n! ieviesis franču matemātiķis K. Kramps 1808. gadā.

4! = ((1 * 2) * 3)*4

17

Page 18: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

1 Sakne

2 Zars 3 Stumbrs

4 Sakne 5 Lapa

6 Ozols 10 Priede

9 Egle

8 Alksnis7 Osis

12 Persiks

11 Virsis

Rekursīva SQL vaicājuma darbības ideja

Noteikt darbiniekus, kuri tieši vai netieši sniedz pārskatus 1 darbiniekam un viņu atskaišu līmeni.

WITHVA_1 (NU, UZ, VAD, A_LIM) as

UNION ALL

select NUM, UZV, VA_NU, 0 AT_LIMfrom DARBINIEKIwhere NUM =1

select e.NUM, e.UZV, e.VA_NU, A_LIM+1 from VA_1 r, DARBINIEKI ewhere r.NU = e.VA_NU

NU UZ VAD A_LIM1 Sakne 0

NUM UZV VA_NU A_LIM1 Sakne 02 Zars 1 13 Stumr

s1 1

6 Ozols 1 110 Priede 1 1

NUM UZV VA_NU A_LIM1 Sakne 02 Zars 1 13 Stumr

s1 1

6 Ozols 1 110 Priede 1 14 Sakne 2 25 Lapa 2 2

18

Page 19: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Rekursīvs SQL vaicājums ar WITH konstrukciju

WITH VA_1 (NU, UZ, VAD, A_LIM) as (select NUM, UZV, VA_NU, 0 AT_LIM from DARBINIEKI where NUM = 1

UNION ALL

select e.NUM, e.UZV, e.VA_NU, A_LIM+1 from VA_1 r, DARBINIEKI e where r.NU = e.VA_NU )

select NU, UZ, VAD, A_LIMfrom VA_1order by A_LIM, NU;

NU UZ VAD A_LIM1 Sakne 0

D_NU

D_UZ VAD_NU AT_LIM

1 Sakne 02 Zars 1 13 Stumrs 1 14 Ozols 1 15 Priede 1 1

19

Page 20: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Noteikt darbiniekus, kuri tieši vai netieši sniedz pārskatus 1 darbiniekam, viņu atskaišu līmeni un vadītāju ķēdi

with VA_1 (NU, UZ, VA, ATS_LIM, VAD_SAR) as (select NUM, UZV, VA_NU, 0 ATS_LIM, CAST(VA_NU as varchar2(200)) from DARBINIEKI where NUM= 1 UNION ALL select e.NUM, e.UZV, e.VA_NU, ATS_LIM+1, CAST(VAD_SAR || ',' || VA_NU as varchar2(200)) FROM VA_1 r, DARBINIEKI e WHERE r.NU = e.VA_NU )

select NU, UZ, VA, ATS_LIM, VAD_SARfrom VA_1order by ATS_LIM, NU;

20

Page 21: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Noteikt darbiniekus, kuri tieši vai netieši sniedz pārskatus 1 darbiniekam un atrodas tiešā pakļautībā (1 līmenis)

with VA_1 (NU, UZ, VA, ATS_LIM, VAD_SAR) as (select NUM, UZV, VA_NU, 0 ATS_LIM, CAST(VA_NU as varchar2(200)) from DARBINIEKI where NUM= 1 UNION ALL select e.NUM, e.UZV, e.VA_NU, ATS_LIM+1, CAST(VAD_SAR || ',' || VA_NU as varchar2(200)) FROM VA_1 r, DARBINIEKI e WHERE r.NU = e.VA_NU )select NU, UZ, VA, ATS_LIM, VAD_SARfrom VA_1where ATS_LIM <=1order by ATS_LIM, NU;

21

Page 22: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Grafiska darbinieku pakārtotības shemas izvade

with POZ_IZV (NU, UZ, VA, ATS_LIM, ALGA) as (select NUM, UZV, VA_NU, 0 ATS_LIM, ALG from DARBINIEKI where VA_NU is null UNION ALL SELECT e.NUM, e.UZV, e.VA_NU, r.ATS_LIM+1 ATS_LIM, e.ALG from POZ_IZV r, DARBINIEKI e WHERE r.NU = e.VA_NU) SEARCH DEPTH FIRST BY UZ SET order1

select LPAD(' ',2*ATS_LIM)||UZ uzvārds, NU, VA, ALGAfrom POZ_IZVorder by order1;

22

Page 23: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

The following statement shows the entire organization, indenting for each level of management, with each level ordered by hire_date. The value of is_cycle is set to Y for any employee who has the same hire_date as any manager above him in the management chain.

WITH dup_hiredate (eid, emp_last, mgr_id, reportLevel, hire_date, job_id) AS (SELECT employee_id, last_name, manager_id, 0 reportLevel, hire_date, job_id FROM employees WHERE manager_id is null UNION ALL SELECT e.employee_id, e.last_name, e.manager_id, r.reportLevel+1 reportLevel, e.hire_date, e.job_id FROM dup_hiredate r, employees e WHERE r.eid = e.manager_id) SEARCH DEPTH FIRST BY hire_date SET order1 CYCLE hire_date SET is_cycle TO 'Y' DEFAULT 'N'SELECT lpad(' ',2*reportLevel)||emp_last emp_name, eid, mgr_id, hire_date, job_id, is_cycleFROM dup_hiredateORDER BY order1;

EMP_NAME EID MGR_ID HIRE_DATE JOB_ID IS_CYCLE---------------------------------------------------------------------------------------King 100 17-JUN-03 AD_PRES N De Haan 102 100 13-JAN-01 AD_VP N Hunold 103 102 03-JAN-06 IT_PROG N Austin 105 103 25-JUN-05 IT_PROG N Kochhar 101 100 21-SEP-05 AD_VP N Mavris 203 101 07-JUN-02 HR_REP N Baer 204 101 07-JUN-02 PR_REP N Higgins 205 101 07-JUN-02 AC_MGR N Gietz 206 205 07-JUN-02 AC_ACCOUNT Y Greenberg 108 101 17-AUG-02 FI_MGR N Faviet 109 108 16-AUG-02 FI_ACCOUNT N Chen 110 108 8-SEP-05 FI_ACCOUNT N. . .

23

Page 24: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Recursive WITH clauses

create table TAB_1 (ID number,VECAKA_ID number,constraint TAB_1_PA primary key(ID),constraint TAB_1_AA foreign key(VECAKA_ID) references TAB_1(ID));

create index TAB_1_IND on TAB_1(VECAKA_ID);

begininsert into TAB_1 values (1, NULL);insert into TAB_1 values (2, 1);insert into TAB_1 values (3, 2);insert into TAB_1 values (4, 2);insert into TAB_1 values (5, 4);insert into TAB_1 values (6, 4);insert into TAB_1 values (7, 1);insert into TAB_1 values (8, 7);insert into TAB_1 values (9, 1);insert into TAB_1 values (10, 9);insert into TAB_1 values (11, 10);insert into TAB_1 values (12, 9);end;

24

Page 25: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

with T1(ID, VECAKA_ID) as ( -- Sākuma (enkura) loceklis. select ID, VECAKA_ID from TAB_1 where VECAKA_ID is null union all -- Rekursīvs loceklis. select t2.ID, t2.VECAKA_ID from TAB_1 t2, T1 where t2.VECAKA_ID = T1.ID)

search breadth first by ID set KARTIBA1select ID, VECAKA_IDfrom T1order by KARTIBA1;

The ordering of the rows is specified using the SEARCH clause, which can use two methods.

1) BREADTH FIRST BY : sibling rows are returned before child rows are processed.

2) DEPTH FIRST BY : child rows are returned before siblings are processed.

T1.ID = 1 nullt2.ID = 2 t2.VECAKA_ID =1t2.ID = 7 t2.VECAKA_ID =1t2.ID = 9 t2.VECAKA_ID =1

t2.ID = 3 t2.VECAKA_ID =2t2.ID = 4 t2.VECAKA_ID =2t2.ID = 8 t2.VECAKA_ID =7t2.ID = 10 t2.VECAKA_ID =9t2.ID = 12 t2.VECAKA_ID =9

t2.ID = 5 t2.VECAKA_ID =4t2.ID = 6 t2.VECAKA_ID =4t2.ID = 11 t2.VECAKA_ID =10

ID PARENT_ID----------------------- 1 2 1 7 1 9 1 3 2 4 2 8 7 10 9 12 9 5 4 6 4 11 10

ID VECAKA_ID---------------------- 1 2 1 3 2 4 2 5 4 6 4 7 1 8 7 9 1 10 9 11 10 12 9

25

Page 26: WITH - Web viewSQL . valodas . WITH konstrukcija tika ieviesa Oracle 9i versijas datu bāzē. WITH konstrukcija ļauj: vaicājumu sadalīt blokos; katram blokam piešķirt nosaukumu;

Cik katram vadītājam ir pakļauto

WITH Sk1 (NU, UZ, VA, VAD_LIM, ALGA, SKAITS) AS (SELECT NUM, UZV, VA_NU, 0 VAD_LIM, ALG, 0 SKAITS FROM DARBINIEKI UNION ALL SELECT e.NUM, e.UZV, e.VA_NU, r.VAD_LIM+1 VAD_LIM, e.ALG, 1 SKAITS FROM Sk1 r, DARBINIEKI e WHERE e.NUM = r.VA )

SEARCH DEPTH FIRST BY UZ SET order1

SELECT UZ, NU, VA, ALGA, sum(SKAITS), max(VAD_LIM) VAD_LIMFROM Sk1GROUP BY UZ, NU, VA, ALGAHAVING max(VAD_LIM) > 0ORDER BY VA NULLS FIRST, VA;

26