Oracel Abfrage

RaketenPeter

Mitglied
Hallo Leute ! Ich arbeite hier als Laie an einer recht großen Datenbank! Ich soll dort eine Abfrage machen die mir Daten liefert die ich in ein bestehendes Toll übernehme
Habe ein bestehendes Select das mir die Datenform vorgibt! und ein weiteres von dem ich der Meinung bin das es mir die Überflüssigen Zeilen rauswirft!

Code:
 -- bestehende abfrage die auch doppelte abfragen zurückliefert! wichtig die ausgabeform hier sollte beibehalten werden!
select a_auftrag.alarm_datum  ||';'|| a_auftrag.annahme_disponent ||';'|| a_auftrag.name ||';'|| a_auftrag.ez_ort ||';'|| a_auftrag.stichwort_bezeichnung ||';'|| to_char (a_telefon.call_arriving, 'HH24:MI:SS')||';'|| to_char(a_telefon.call_taken , 'HH24:MI:SS')||';'|| to_char(a_telefon.call_end, 'HH24:MI:SS') ||';'||a_auftrag.ANNAHME_END_ZEIT ||';'|| a_auftrag.ALARM_ZEIT  ||';'|| a_auftrag.EINSATZUEBERNAHME_ZEIT  ||';'|| a_auftrag.EINTREFFEN_ZEIT ||';'|| einsatzende_zeit
from a_auftrag, a_telefon
where a_auftrag.einsatzzaehler = a_telefon.mission_counter
and a_auftrag.alarm_datum between '01.01.08 00:00:00,000 +01:00' and '29.02.08 23:59:59,999 +01:00'  
and ( a_auftrag.typ like '%RTW' or a_auftrag.typ like '%NEF') 
and sondersignal = '1' order by alarm_datum ;

-- ergaenzung um bei doppelte spalten (doppeltvergebener einsatzzaehler) die mit der kleinsten eintreffen_zeit zu waehlen
-- diese sollte ggf als subselect aufgerufen werden (falls subselect mit mehr als einer zeile ausgabe moeglich)

select einsatzzaehler, min(TO_DATE(EINTREFFEN_ZEIT, 'HH24:MI:SS')) from a_auftrag
group by einsatzzaehler
order by einsatzzaehler


Der obere select hat noch etliche doppelte EINSATZZAEHLER Eintraege, von diesen will ich mittels min() immer nur den mit der kleinsten EINTREFFEN_ZEIT. funktionieren tun beide selects aber ich finde nicht herraus wie ich beide verschachteln kann.
Ist es überhaupt möglich in einem select ein subselect mit mehr als einer Zeile zu machen? Oder rmuss ich evtl das eine Ergebnis in eine temporäre Tabelle schreiben und diese dann wiederum mit dem 2ten select abfragen?

Vielen Dank für eure hilfe ! ;)

grüße Jens
 
das klingt nach einem Fall für analytische Funktionen. Analytics machen es möglich, das Ergebnis einer Gruppierung in die eigentliche Abfrage zu integrieren, ohne dass es erforderlich ist, eine zusätzliche gruppierende Abfrage zu formulieren. Das sähe dann etwa folgendermaßen aus:

SQL:
select <konkatenierte Spalten>
  from a_telefon,
       (select <alle relevanten Spalten aus a_auftrag>
               a_auftrag.EINTREFFEN_ZEIT,
               min( a_auftrag.EINTREFFEN_ZEIT) over (partition by
                         a_auftrag.einsatzzaehler) min_EINTREFFEN_ZEIT
          from a_auftrag
         where <Einschränkungen für a_auftrag>) t
 where t.EINTREFFEN_ZEIT = t.min_EINTREFFEN_ZEIT
   and <join-Bedingung>

Die analytische Funktion liefert dabei in jeder Zeile den minimalen EINTREFFEN_ZEIT-Wert für den gegebenen einsatzzaehler, so dass man über die Bedingung where t.EINTREFFEN_ZEIT = t.min_EINTREFFEN_ZEIT alle Sätze ausschließt, deren EINTREFFEN_ZEIT größer ist als das Minimum der Gruppe.

Gruß

MP
 
Zuletzt bearbeitet von einem Moderator:
ui vielen dank werd morgen frueh ma schaun was cih damit anfangen kann ;)!
vielen dank schonn ma vorab ! ;)

ps nette gegend aus der du bist bin acuh von da ;D
 
so nun kommt die große Frage ;)

habe mal den halben morgen getüfftelt ..... ABER ...

also das ist meine Abfrage wie ich Sie nach deiner Hilfe zusammengebaut habe

Code:
select a_auftrag.alarm_datum  ||';'|| a_auftrag.annahme_disponent ||';'|| a_auftrag.name ||';'|| a_auftrag.ez_ort ||';'||
	   a_auftrag.stichwort_bezeichnung ||';'|| to_char (a_telefon.call_arriving, 'HH24:MI:SS')||';'||
	   to_char(a_telefon.call_taken , 'HH24:MI:SS')||';'|| to_char(a_telefon.call_end, 'HH24:MI:SS') ||';'||
	   a_auftrag.ANNAHME_END_ZEIT ||';'|| a_auftrag.ALARM_ZEIT  ||';'|| a_auftrag.EINSATZUEBERNAHME_ZEIT  ||';'||
	   a_auftrag.EINTREFFEN_ZEIT ||';'|| a_auftrag.einsatzende_zeit
from a_telefon, a_auftrag , (select a_auftrag.alarm_datum  , a_auftrag.annahme_disponent , a_auftrag.name , a_auftrag.ez_ort ,
				a_auftrag.stichwort_bezeichnung , a_auftrag.ANNAHME_END_ZEIT , a_auftrag.ALARM_ZEIT  ,
				a_auftrag.EINSATZUEBERNAHME_ZEIT  , a_auftrag.EINTREFFEN_ZEIT , a_auftrag.einsatzende_zeit,
				min(a_auftrag.EINTREFFEN_ZEIT) over (partition BY a_auftrag.EINSATZZAEHLER) min_EINTREFFEN_ZEIT
				from a_auftrag
				where a_auftrag.alarm_datum between '01.01.08 00:00:00,000 +01:00' and '29.02.08 23:59:59,999 +01:00'
				and ( a_auftrag.typ like '%RTW' or a_auftrag.typ like '%NEF')
				and sondersignal = '1'
				and eintreffen_flag = '1') temptable
where temptable.EINTREFFEN_ZEIT = temptable.min_EINTREFFEN_ZEIT
and a_auftrag.einsatzzaehler = a_telefon.mission_counter

Allerdings haut er mich nun mit dem Fehler >>ora-01652 unable to extend temp segment by 256 in tablespace<< raus

Ich vermute das ich wohl beim join nen Fehler hab aber ich finde nicht raus wo! Jemand eine Idee?

Vorrab schon ma Danke ;)
 
da temptable nicht an die übrigen Tabellen gejoint wird, ist das ein cartesisches Produkt, das den Sortierbereich des temporary tablespace sprengt. Ich würde mal folgendes versuchen:

SQL:
select a_auftrag.alarm_datum  ||';'|| a_auftrag.annahme_disponent ||';'|| a_auftrag.name ||';'|| a_auftrag.ez_ort ||';'||
	   a_auftrag.stichwort_bezeichnung ||';'|| to_char (a_telefon.call_arriving, 'HH24:MI:SS')||';'||
	   to_char(a_telefon.call_taken , 'HH24:MI:SS')||';'|| to_char(a_telefon.call_end, 'HH24:MI:SS') ||';'||
	   a_auftrag.ANNAHME_END_ZEIT ||';'|| a_auftrag.ALARM_ZEIT  ||';'|| a_auftrag.EINSATZUEBERNAHME_ZEIT  ||';'||
	   a_auftrag.EINTREFFEN_ZEIT ||';'|| a_auftrag.einsatzende_zeit
from a_telefon, (select a_auftrag.alarm_datum  , a_auftrag.annahme_disponent , a_auftrag.name , a_auftrag.ez_ort ,
				a_auftrag.stichwort_bezeichnung , a_auftrag.ANNAHME_END_ZEIT , a_auftrag.ALARM_ZEIT  ,
				a_auftrag.EINSATZUEBERNAHME_ZEIT  , a_auftrag.EINTREFFEN_ZEIT , a_auftrag.einsatzende_zeit,
				min(a_auftrag.EINTREFFEN_ZEIT) over (partition BY a_auftrag.EINSATZZAEHLER) min_EINTREFFEN_ZEIT
				from a_auftrag
				where a_auftrag.alarm_datum between '01.01.08 00:00:00,000 +01:00' and '29.02.08 23:59:59,999 +01:00'
				and ( a_auftrag.typ like '%RTW' or a_auftrag.typ like '%NEF')
				and sondersignal = '1'
				and eintreffen_flag = '1') a_auftrag
where a_auftrag.EINTREFFEN_ZEIT = a_auftrag.min_EINTREFFEN_ZEIT
and a_auftrag.einsatzzaehler = a_telefon.mission_counter

wobei man für die Inline-Query lieber einen anderen Alias als a_auftrag verwenden sollte (die Mehrfachverwendung eines Alias kann recht merkwürdige Korrelationseffekte bringen)

Gruß

MP
 
Zuletzt bearbeitet von einem Moderator:
ei prima nun hab auch ich es verstanden ;) das mit der namensgebung hat mir tatsaechlich fehler ohne ende gebracht! habs umbenannt und siehe da!! ES GEHT ;)

VIELEN DANK

hier nochma der SELECT wie er läuft ;)



Code:
SELECT t.einsatzzaehler,t.alarm_datum  , t.annahme_disponent , t.name , t.ez_ort ,
           t.stichwort_bezeichnung , to_char (a_telefon.call_arriving, 'HH24:MI:SS'),
           to_char(a_telefon.call_taken , 'HH24:MI:SS'), to_char(a_telefon.call_end, 'HH24:MI:SS') ,
           t.ANNAHME_END_ZEIT , t.ALARM_ZEIT  , t.EINSATZUEBERNAHME_ZEIT  ,
           t.EINTREFFEN_ZEIT , t.einsatzende_zeit
FROM a_telefon, (SELECT a_auftrag.einsatzzaehler, a_auftrag.alarm_datum  , a_auftrag.annahme_disponent , a_auftrag.name , a_auftrag.ez_ort ,
           a_auftrag.stichwort_bezeichnung , a_auftrag.ANNAHME_END_ZEIT , a_auftrag.ALARM_ZEIT  ,
           a_auftrag.EINSATZUEBERNAHME_ZEIT  , a_auftrag.EINTREFFEN_ZEIT , a_auftrag.einsatzende_zeit,
           min(a_auftrag.EINTREFFEN_ZEIT) over (partition BY a_auftrag.EINSATZZAEHLER) min_EINTREFFEN_ZEIT
           FROM a_auftrag
           WHERE a_auftrag.alarm_datum BETWEEN '11.12.07 00:00:00,000 +01:00' AND '10.03.08 23:59:59,999 +01:00'
           AND ( a_auftrag.typ LIKE '%RTW' OR a_auftrag.typ LIKE '%NEF')
           AND sondersignal = '1'
           AND eintreffen_flag = '1') t
 WHERE t.EINTREFFEN_ZEIT = t.min_EINTREFFEN_ZEIT
     AND a_telefon.call_taken is NOT NULL
    AND t.einsatzzaehler = a_telefon.mission_counter
    order by t.einsatzzaehler

nochmals vielen dank für deine hilfe
 
Zurück