Announcement

Collapse
No announcement yet.

Prozedur vereinfachen.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prozedur vereinfachen.

    Hallo Leute. Ich habe eine Frage und kenne mich mit SQL nicht gut aus.

    Hier ist erstmal das Problem, dass ich zu lösen versuche:

    ich habe eine Tabelle1 mit n Elementen. Hier fange ich mit meiner Abfrage an. Für jedes Element aus dieser Tabelle mache ich folgendes: (Einfache For Schleife) 1. Finde in der Tabelle2 das Element, dass über einen Schlüssel mit dem Element aus tabelle1 zusammenhängt. Speicherung in einem Array (Einfache Select Abfrage). 2. Finde in Tabelle3 das Element, dass über einen schlüssel mit dem unter 1. gefundenen Element zusammenhängt. Speicherung in einem Array(Wieder einfache Select Abfrage) 3. Finde in Tabelle3 die ElementE (es können n sein) die über koordinaten mit dem unter 2 gefundenen Element zusammenhängt. N-Elemente in einem Array speichern. Fange mit dem ersten davon an. (wieder Loop) 4-n. Jetzt wiederholt sich Nr. 3 bis kein Element mehr existiert, dass über die Koordinaten mit dem letzten element verbunden ist. Abfrage, ob letztes Element zu einer bestimmten Klasse gehört.

    -- meine Fragen: 1. wie du siehst können sich hier Baumstrukturen entwickeln, die sehr lang werden können. Wie kann ich geschickt ein programm schreiben, so dass ich nicht für jede der 4-n Schritte ein neues Array erstellen, darin speichern und wieder einen Loop starten muss?? 2. Da die "wurzeln" miteinander verbunden sein können möchte ich verhindern, dass schonmal abgefahrene Elemente nicht nochmal verwendet werden. Wie kann ich das Machen? Evtl eine Prüfung der Tabelle3 mit einer tabelle4(geprüfte elemente) oder dem löschen der daten aus der Tabelle?


    und hier ist der bisherige Code:

    for rec in (
    select (ID)
    from v_KVS)
    loop


    select (id, father_id, nispg_anlagen_id, x1, y1, x2, y2)
    From v_Nispg_sicherung
    where v_KVS.id = v_nispg_sicherung.nispg_anlagen_id
    and Father_ID is not NULL;

    --wie speicher ich das Ergebnis in ein array?

    for rec in (
    select spalte id, father_id, nispg_anlagen_id, x1, y1, x2, y2
    from array1)
    loop


    select (id, table_id, father_id, x1, y1, x2, y2)
    from v_View_Netzobjekte
    where v_nispg_sicherung.Fahter_ID = v_view_netzobjekte.ID
    AND (
    (v_Nispg_sicherung.x1 = v_view_netzobjekte.x1
    AND v_Nispg_sicherung.y1 = v_view_netzobjekte.y1)
    OR
    (v_Nispg_sicherung.x2 = v_view_netzobjekte.x2
    AND v_Nispg_sicherung.y2 = v_view_netzobjekte.y2)
    )

    --Hier versuche ich die Koordinaten zu finden, die das Ende des Elements beschreiben.

    -- Save this into Array2


    Select (id, table_id, father_id, x1, y1, x2, y2)
    From v_view_netzobjekte
    where array2.x1 = v_view_netzobjekte.x1
    and arrey2.y1 = v_viw_netzobjekte.y1 --respectivly the other coordinates

    for rec in (
    select (id, table_id, father_id, x1, y1, x2, y2)
    From Array2)
    loop

    Select (id, table_id, father_id, x1, y1, x2, y2)
    From v_view_netzobjekte
    where array2.x1 = v_view_netzobjekte.x1
    and arrey2.y1 = v_viw_netzobjekte.y1

    -- dieser Loop müsste jetzt solange wiederholtwerden (und jede Schleife kann wieder bis zu n Elemente ausgeben) bis es keine Elemente gibt, die mit den Koordinaten verknüft sind. Da müsste ich aber immer wieder den Loop neu schreiben, da ich nicht weiß wie tief der Baum geht. Gibt es da eine bessere Lösung?
    -- Außerdem will ich die bereits durchlafenden Elemente (aus einer Schleife) nicht später nochmal duchlaufen 8theoretisch ist das hier möglich, da die Elemente miteinander verbunden sein können.


    Vielen Dank

  • #2
    Das hört sich alles so an, als ob es durch einen einfachen Join gelöst werden kann: http://docs.oracle.com/cd/E11882_01/...queries006.htm
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Hi
      leider ist das nicht der Fall.
      ich habe mal versucht das, was ich brauche in testform zu schreiben. Kann mir vielleicht einer helfen mit dem SQL code dafür?

      Table start
      Table objects
      Table Children
      Table found_objects;
      Table queue;
      Table failure;

      For each row in table start do:
      Insert the row into table queue

      while (queue IS Not empty) -- AS Long as there are rows in queue
      {
      Select the first row out of queue and delete it from queue
      Insert row into found_objects
      Select those rows from objects where condition is fulfilled and save them into children;
      If children IS empty AND row is not of class a,b or c then
      Insert row into failure
      Else
      foreach row of of children
      if row is not in queue or found_objects then
      insert row into queue and delete it from children
      Else delete it from children
      }

      Danke.

      Comment

      Working...
      X