join (Unix)

A Wikipédiából, a szabad enciklopédiából

A join Unix-utasítás a relációs adatbázisokban szokásos join műveletet végzi el két szövegfile között. Az utasítás a két file-t szövegtáblázatnak tekinti, a sorokat egy elválasztó karakterrel (alaphelyzetben helyközzel, de ez változtatható) oszlopokra vágja.

Mindkét file-ban meg kell adni egy-egy speciális kulcsoszlopot. A join összepárosítja az azonos értékeket a két file kulcsoszlopaiban, és az eredményben egyetlen sorként írja ki; a kulcsoszlopot csak egyszer, azt követi az első, majd a második file többi oszlopa.

Mindkét file a saját kulcsoszlopa szerint rendezett kell legyen.

Az utasítás alakja[szerkesztés]

join kapcsolók file1 file2

A kapcsolók egybetűsek, a hozzájuk tartozó értéket helyközzel kell elválasztani.[1] A fontosabbak:

-1 oszlop az első file kulcsnak kijelölt oszlopa (alapérték: 1)
-2 oszlop a második file kulcsnak kijelölt oszlopa (alapérték: 1)
-t karakter az oszlopokat elválasztó karakter (alaphelyzetben helyköz)[2]
-a n filen sorait írja ki akkor is, ha nincs párjuk a másik file-ban (outer join)
-v n filen azon sorait írja ki, melyeknek nincs párjuk a másik file-ban

Linuxban ha mindkét file-ban azonos oszlop a kulcs, ezt az oszlopot a -j kapcsolóval adhatjuk meg.

Példa[szerkesztés]

f1.txt második, f2.txt első oszlopa a kulcs. Mindkét file a kulcsra rendezett. f2.txt-ben két azonos kulcsú sor található.

Utasítás/SQL-analóg Eredmény
join -1 2 -2 1 f1.txt f2.txt
1 f1sor1 f2sor1
2 f1sor2 f2sor2
2 f1sor2 f2sor3
select * from f1, f2 where f1.oszl2 = f2.oszl1;
(normál join)
join -1 2 -2 1 -a 1 f1.txt f2.txt
1 f1sor1 f2sor1
2 f1sor2 f2sor2
2 f1sor2 f2sor3
3 f1sor3
x f1sor4
select * from f1, f2 where f1.oszl2 = f2.oszl1(+);
(outer join)
join -1 2 -2 1 -a 2 f1.txt f2.txt
1 f1sor1 f2sor1
2 f1sor2 f2sor2
2 f1sor2 f2sor3
f2sor4 4
f2sor5 y
select * from f1, f2 where f1.oszl2(+) = f2.oszl1;
(outer join)
join -1 2 -2 1 -v 1 f1.txt f2.txt
3 f1sor3
x f1sor4
select * from f2 where f2.oszl1 not in(select f1.oszl2 from f1);
(not in)
join -1 2 -2 1 -v 2 f1.txt f2.txt
f2sor4 4
f2sor5 y
select * from f1 where f1.oszl2 not in(select f2.oszl1 from f2);
(not in)
join -1 2 -2 1 -v 1 -v 2 f1.txt f2.txt
3 f1sor3
f2sor4 4
x f1sor4
f2sor5 y
select * from f2 where f2.oszl1 not in(select f1.oszl2 from f1)

union
select * from f1 where f1.oszl2 not in(select f2.oszl1 from f2);

(különbség)[3]

f1.txt
f1sor1 1
f1sor2 2
f1sor3 3
f1sor4 x
f2.txt
1  f2sor1
2  f2sor2
2  f2sor3
4  f2sor4
y  f2sor5

Jegyzetek[szerkesztés]

  1. Linuxban ez nem kötelező, de pl. Solarisban igen.
  2. Két vagy több egymás utáni elválasztó karakter egy oszlophatárnak számít.
  3. Az SQL-utasítás csak akkor hajtható végre, ha f1 és f2 azonos számú és típusú oszlopokkal rendelkezik. A fenti utasítás csak analógia.