Probleme mit JOIN

JesusFreak777

Erfahrenes Mitglied
Hallo ich will eine ORACLE abfrage machen aus 2 Tabellen...

meine Abfrage sieht etwa so aus:

Code:
SELECT *
  from (SELECT to_char(id) pid,  t.bezeichnung, t.sjb_id, start, stop,
  case
  when stop is not null then
  round((stop- start) * 24 * 60)
  else
  round((sysdate - start) * 24 * 60)
  end dauer
  FROM ZEITEN t
  WHERE trunc(start) = trunc(sysdate)) tt
-- join PROTOKOLLE lp ON tt.sjb_id = lp.jobs
where dauer>= 120
order by start

Die Ausgabe wurde etwas beschnitten (wegen Sensibler daten und übersichtlichkeit).

Als ergebnis erhalte ich dann hier 3 Einträge... Wenn ich das JOIN hinzufüge erhalte ich alle einträge...

in der Tabelle Protokolle sind ALLE Einträge enthalten... Eigentlich will ich nur ein Feld von Protokolle dazujoinen:

Tabelle 1
ID Feld1 Feld2 Feld3...
nach WHERE 3 Einträge

Tabelle 2
PID ID FeldX FeldY FeldZ
Tausende Einträge

Ich will mir Tabelle 1 ausgeben (mit meinen 3 Einträgen) und von Tabelle 2 nur PID anfügen
Tabelle 1.ID = Tabelle 2.ID

Wer kann mir da helfen?

Vielen Dank
Gruß Simon
 
*
Jepp, der * ist schuld. Er gibt alle Felder von beiden Tabellen aus.
Wenn du nur ein Feld von protokolle und alle Felder aus tt haben willst, dann müsste der Select so aussehen

SQL:
SELECT protokolle.feld, tt.*
FROM..
 
hm, evtl. habe ich es zu start beschnitten... jetzt nochmal 1:1 nur mit anderen namen

Code:
SELECT *
FROM
  (SELECT to_char(t.id) ProcessID,
  t.bez,
  t.start,
  t.stop,
  t.idtbl1,
  t.status,
  lp.id,
  CASE
  WHEN stop IS NOT NULL THEN round((stop - start) * 24 * 60)
  ELSE round((sysdate - start) * 24 * 60)
  END DauerMinuten
  FROM JOBZEITEN t
  --JOIN JOBS lp ON t.idtbl1 = lp.idtbl2
  WHERE trunc(start) = trunc(sysdate)) tt
  --JOIN JOBS lp ON tt.idtbl1 = lp.idtbl2
WHERE DauerMinuten >= 120
ORDER BY start

egal welches JOIN ich anschalte bekomme ich endlos viele Zeilen...

ansonsten eben nur 3

Ziel ist es genau diese 3 Zeilen mit der ID aus JOBS

wenn ich oben bei SELECT * z.B. SELECT ProcessID mache... bekomme ich trotzdem Tausende Zeilen (nur eben mit nur ProcessID)

Danke erstmal
 
Zuletzt bearbeitet:
Ah, Zeilen. Weiter Oben hast du von Feldern geschrieben..

Dann ist der JOIN auf dem falschen Feld. bzw. Nicht eindeutig
 
hm,... okay, Stimmt

da ichs aber nicht eindeutiger hinbekomme kann ich das dann irgendwie Limitieren?

sodass ich immer nur den 1. Wert (vom JOIN) bekomme?
 
wenn ich z.B. distinct anwende
Code:
SELECT distinct*
FROM
  (SELECT to_char(t.id) ProcessID,
  t.bez,
  t.start,
  t.stop,
  t.idtbl1,
  t.status,
  --lp.id,
  CASE
  WHEN stop IS NOT NULL THEN round((stop - start) * 24 * 60)
  ELSE round((sysdate - start) * 24 * 60)
  END DauerMinuten
  FROM JOBZEITEN t
  --JOIN JOBS lp ON t.idtbl1 = lp.idtbl2
  WHERE trunc(start) = trunc(sysdate)) tt
  --JOIN JOBS lp ON tt.idtbl1 = lp.idtbl2
WHERE DauerMinuten >= 120
ORDER BY start

würde er mir wieder nur meine 3 Zeilen ausgeben... sobald ich aber die ID aus der anderen Tabelle dazuhole (wofür ich das ganze ja mache) habe ich wieder zu viele datensätze...

mit LIMIT, COUNT(*), GROUP BY, hab ichs bisher nicht hinbekommen...

ORACLE ist UNCOOL!
 
Oracle ist Cool. Du hasts nur nicht im Griff :)

Du kannst ein Subquery auf die jobs machen
SQL:
select distinct IDTBL2, ID
from jobs

Und dieses SubQuery kannst du jetzt Joinen
 
hm, die IDTBL2 gibt es öfters (ist gleich der IDTBL1 und nach meinen Filter nur noch ein mal [das dann drei mal]),... die ID (aus JOBS) nur einmal...

wenn ich das genau so mache... ändert es nichts... ich erhalte immernoch

idtbl1, idtbl2, ID (von jobs)
1, 1, 3
1, 1, 6
1, 1. 7
2, 2, 1
2, 2, 2
...

idtbl1 gibt eig. nur
1
2
zurück

ich bekomms nicht hin...

Dadruch das die ID Unterschiedlich ist, gibt mir distinct ja auch jeden wert aus...
Code:
JOIN (SELECT DISTINCT IDTBL2, ID FROM JOBS) lp ON t.IDTBL1 = lp.IDTBL2
 
Das sind deine Daten. Wenn du pro idtbl2 mehrere id hast, musst du uns mal mitteilen welche id dann Oracle nehmen soll. Die Grösste, die Kleinste? Eine kommaseparierte Liste der IDs?
 
die größte (was gleichzeitig auch die erste ist -> also der neuste eintrag)

=> wobei kommasepariert auch geil wäre... (aber das dann als Spielerei)
 
Zurück