[ 1 ] [ 2 ] [ 3 ] [ 4 ]

Kartesisches Produkt

Wird die Verknüpfungsbedingung weggelassen, so verknüpft SQL jeden Satz der ersten Tabelle mit jedem Satz der zweiten (und weiteren)! Diese Operation nenn man ‚Kartesisches Produkt‘ – Ein Begriff aus der Matrix-Rechnung.

Equi-Join (Natural Join)

Einschluß aller Felder aller Tabellen – das ist oft unpraktisch. Meist will man die Schlüsselfelder nicht redundant im Ergebnis haben. Deswegen beschreibt man die Feldliste mit Alias-Angaben und wählt somit die in beiden (oder mehreren Tabellen ) gleichen Felder nur je einmal aus.

 SELECT * from preise07 join preise08 on ; 
  preise07.art_id = preise08.art_id 

ART_ID_A STK_PREIS_ ART_ID_B STK_PREIS2

2

19,0000

2

22,0000

3

10,0000

3

11,0000

5

21,3500

5

17,0000

6

25,0000

6

25,0000

8

40,0000

8

40,0000

9

97,0000

9

110,0000

10

31,0000

10

35,0000

11

21,0000

11

19,0000

12

38,0000

12

39,0000

13

6,0000

13

7,0000

14

23,2500

14

22,0000

Mit einer angepaßten Feldliste sieht das gleiche Ergebnis besser aus:

 SELECT ; 
    preise07.art_id, ; 
    preise07.stk_preis as preis07, ; 
    preise08.stk_preis as preis08 ; 
    from preise07 join preise08 on ; 
    preise07.art_id =  preise08.art_id 

ART_ID PREIS07 PREIS08

2

19,0000

22,0000

3

10,0000

11,0000

5

21,3500

17,0000

6

25,0000

25,0000

8

40,0000

40,0000

9

97,0000

110,0000

10

31,0000

35,0000

11

21,0000

19,0000

12

38,0000

39,0000

13

6,0000

7,0000

14

23,2500

22,0000

Allerdings enthält das Ergebnis offenbar nicht alle Sätze der linken Tabelle. Wir formulieren daher einen Outer Join

Outer Join

Left Join, Right Join, Full Join

 SELECT * from preise07 left join preise08 on ; 
preise07.art_id = preise08.art_id 

  Preise07   Preise08

     1

18,0000

.NULL.

.NULL.

     2

19,0000

     2

22,0000

     3

10,0000

     3

11,0000

     5

21,3500

     5

17,0000

     6

25,0000

     6

25,0000

     7

30,0000

.NULL.

.NULL.

     8

40,0000

     8

40,0000

     9

97,0000

     9

110,0000

    10

31,0000

    10

35,0000

    11

21,0000

    11

19,0000

    12

38,0000

    12

39,0000

    13

6,0000

    13

7,0000

    14

23,2500

    14

22,0000

    15

15,5000

    15

14,5000

    16

17,4500

    16

19,0000

    17

39,0000

    17

44,0000

    18

62,5000

    18

70,0000

    20

81,0000

.NULL.

.NULL.

    21

10,0000

    21

9,0000

    22

21,0000

    22

25,0000

 SELECT * from preise07 right  join preise08 on ; 
  preise07.art_id =  preise08.art_id 

  Preise07   Preise08

   2

19,0000

   2

22,0000

   3

10,0000

   3

11,0000

.NULL.

.NULL.

   4

25,0000

   5

21,3500

   5

17,0000

   6

25,0000

   6

25,0000

   8

40,0000

   8

40,0000

   9

97,0000

   9

110,0000

 SELECT * from preise07 full join  preise08 on ; 
  preise07.art_id =  preise08.art_id 

  Preise07   Preise08

.NULL.

   4

25,0000

.NULL.

  19

8,0000

.NULL.

  78

25,8750

.NULL.

  79

1,7825

.NULL.

  80

100,0500

.NULL.

  81

37,9500

.NULL.

  82

63,3765

   1

18,0000

.NULL.

   2

19,0000

   2

22,0000

   3

10,0000

   3

11,0000

   5

21,3500

   5

17,0000

   6

25,0000

   6

25,0000

   7

30,0000

.NULL.

   8

40,0000

   8

40,0000

Nullwerte: NVL(), Isnull()

Bei Outer Joins ergeben die ‚nicht Treffer‘ sozusagen Löcher im Ergebnis. In der Datenbanksprache werden sie als NULL-Werte beschrieben. .NULL. hat keinen Datentyp und ist nicht mit der „leeren Menge“ gleichzusetzen. In Vergleichsoperationen und Rechenoperationen erzeugt der Nullwert immer wieder .NULL. oder unvorhersehbare Werte.

Zur Behandlung von Nullwerten dienen die Funktionen

ISNULL(<Ausdruck>) und NVL(<Ausdruck 1>,< Ausdruck 2>) 
  
 SELECT nvl(preise07.art_id,preise08.art_id) as art_id, ; 
  nvl(preise08.stk_preis,preise07.stk_preis) as stk_preis, ; 
  preise08.stk_preis - preise07.stk_preis as aenderung ; 
  from preise07 full join preise08 on ; 
  preise07.art_id = preise08.art_id ; 
  order by 1 

Art_id Stk_Preis Aenderung

  1

18,0000

.NULL.

   2

22,0000

3,0000

   3

11,0000

1,0000

   4

25,0000

.NULL.

   5

17,0000

-4,3500

   6

25,0000

.NULL.

   7

30,0000

0,0000

   8

40,0000

0,0000

   9

110,0000

13,0000

  10

35,0000

4,0000

  11

19,0000

-2,0000

Machen Sie einen Vorschlag, wie die Nullwerte der neuen Spalte „Änderung“ behandelt werden sollten!

[ 1 ] [ 2 ] [ 3 ] [ 4 ]