Mittwoch, 22. Dezember 2010

Correlated Subqueries

select *
  from
part
 where
part_id in (
   select distinct
part_id
     from
item
    where
item_id in (
      select
item_id
        from
system_item_structure
       where
status_deleted = 1

     )
  );
-------------- oder ------------------

SELECT DISTINCT
LieferNr
  FROM
Lieferprogramm lp1
 WHERE NOT EXITS (

   SELECT TeileNr
     FROM
Teil t1
    WHERE NOT EXITS (

      SELECT LieferNr
        FROM
Lieferprogramm lp2
       WHERE
lp1.LieferNr = lp2.LieferNr
         AND
t1.TeileNr = lp2.TeileNr 

    )
 );

Dies kann besser, effizienter durch eine PL/SQL-Lösung ersetzt werden:

DECLARE
 

  CURSOR Lieferanten IS
    SELECT DISTINCT
LieferNr 

      FROM Lieferprogramm;
 
  CURSOR
Teile IS
    SELECT DISTINCT
TeileNr  

      FROM Lieferprogramm;
   AktLief Lieferprogramm.LieferNr%Type;  AktTeil Lieferprogramm.TeileNr%Type;  Treffer BOOLEAN;
 
BEGIN
  OPEN
Lieferanten;
  LOOP
    FETCH
Lieferanten INTO AktLief;
    EXIT WHEN
Lieferanten%NOTFOUND;    Treffer := TRUE;

 
    OPEN Teile;
    WHILE Treffer LOOP
      FETCH Teile INTO AktLief;
      EXIT WHEN Teile%NOTFOUND;
      SELECT DISTINCT LieferNr  
        FROM Lieferprogramm;
       WHERE LieferNr = AktLief
         AND
TeileNr = AktTeil;      Treffer := SQL%FOUND;
    END LOOP;
    IF
Treffer THEN
      INSERT INTO
Temp VALUES (AktLief);
    CLOSE
Teile;

 
  END Loop;
  CLOSE
Lieferanten;

 
END;

Keine Kommentare: