Zum Inhalt springen

Oracle/SQLServer: Zwei gleiche Statements, zwei Ergebnisse???


Yakuzza

Empfohlene Beiträge

Morgen NG,

ich kämpfe seit ein paar Stunden an zwei SQL-Statements. Beiden sollen mir das gleiche Ergebnis liefern, das eine auf SQLServer, das andere auf Oracle. Leider unterschlägt Oracle ein paar Datensätze. Zuerst die verkürzten Statements, dann kurze Erklärung mit genauer Frage:

ORACLE


SELECT	A.ID,

	A.Name,

	S.Logdate

FROM A, S

WHERE A.CID LIKE '1' 

  AND S.Accountid(+) = A.ID

  AND S.Eventid(+) = 1

  AND S.ID IN (SELECT MAX(ID) FROM S GROUP BY AID)

SQL

SELECT	[A].[ID],

	[A].[Name],

	[S].[LogDate]

FROM A

LEFT OUTER JOIN S

  ON [A].[ID] = [S].[AccountID]

  AND [S].[EventID] = 1

  AND [S].[ID] IN (SELECT MAX(ID) FROM [S] GROUP BY AID)

WHERE A.CID LIKE '1'

Beim SQL Statement kommen auch Datensätze bei denen in der Spalte .[LogDate] nichts steht. Oracle unterdrückt diese Datensätze dann, was leider falsch ist. Sieht jemand eine Möglichkeit Oracle zu sagen, was ich will?

THnx!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Für mich sieht's so aus, daß du da alle Zeilen der Tabelle A ausgeben willst, auch wenn sie keine Entsprechung in der S haben. Das geht mit dem Left Outer Join ja auch gut. Unter Oracle würde ich daher versuchen, das S.Logdate per Subselect zu holen.

Wenn es zwischen der S und der A eine "N zu 1"-Verknüpfung gibt, sieht's schwieriger aus. Da könntest du höchstens versuchen, in der Where-Klausel noch per Oder-Verknüpfung die Zeilen hinzuzuholen, die keine Entsprechung in der S haben...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von beetFreeQ

Wenn es zwischen der S und der A eine "N zu 1"-Verknüpfung gibt, sieht's schwieriger aus. Da könntest du höchstens versuchen, in der Where-Klausel noch per Oder-Verknüpfung die Zeilen hinzuzuholen, die keine Entsprechung in der S haben...

... das ist mein Problem. Ich hab in der Spalte S.LogDate manchmal 10.000 Einträge zu einer A.ID, manchmal keine.

Ich probiere jetzt schon stundenlang rum. Entweder liefert mir Oracle jede A.ID mit jedem LogDate oder nur die, die ein Logdate haben... :( :confused:

Link zu diesem Kommentar
Auf anderen Seiten teilen

...jetzt mal ganz blöd in den Raum gestellt - auch wenn ich keine Ahnung von Oracle habe.

Aber das Oracle-Statement sieht mir schwer nach einem INNER JOIN aus - und der liefert dann ganz klar weniger Datensätze als ein LEFT OUTER JOIN.

Gibt es unter Oracle keine Entsprechnung dazu??? (Kann ich fast nicht glauben.)

Im Zweifelfall würde ich versuchen, das Oracle-Statement als UNION aufzubauen, also erst den Teil, der jetzt schon da steht, dann UNION mit einem Select, der so aussehen könnte:

SELECT A.ID,

A.Name,

'<WasAuchImmer>' AS Logdate

FROM A

WHERE A.CID LIKE '1'

AND A.ID NOT IN (SELECT Accountid FROM S GROUP BY Accountid)

Sollte im Zweifelsfall das selbe Ergebnis liefern... wenn ich es auch für etwas umständlich halte.

:confused:

Der Onkel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von HolzOnkel

...jetzt mal ganz blöd in den Raum gestellt - auch wenn ich keine Ahnung von Oracle habe.

Aber das Oracle-Statement sieht mir schwer nach einem INNER JOIN aus - und der liefert dann ganz klar weniger Datensätze als ein LEFT OUTER JOIN.

Gibt es unter Oracle keine Entsprechnung dazu??? (Kann ich fast nicht glauben.)

Gibt es. Nur leider auf eine Art und Weise, der ich nicht klar machen kann, daß es auch die Einträge holen soll, die kein Logdate haben. Eigentlich wird ein Outer Join durch "(+)" markiert. Ich hab keine Möglichkeit gefunden der Oracle das Verhalten des SQLServer beizubringen...

Im Zweifelfall würde ich versuchen, das Oracle-Statement als UNION aufzubauen, also erst den Teil, der jetzt schon da steht, dann UNION mit einem Select, der so aussehen könnte:

--- cut ---

Habe ich versucht. Mein primäres Problem ist die Geschwindigkeit. Es gibt ein Statement, welches unter Oracle das richtige Ergebnis liefert, leider aber zwischen 10 und 120 Sekunden dauert. Dieses Performanceproblem wollte ich umgehen. Bei SQL ist es mir gelungen. Leider führten alle Ansätze für die Oracle zum falschen Ergebnis oder einer Dauer > 10 Sekunden... (leider gibt es keinen heulenden Smily...)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Morgen,

wollte mich für den Input von euch bedanken. Durch einen Geistesblitz habe ich die Lösung gefunden, die ich euch nicht vorenthalten möchte:




SELECT	A.ID,

	A.Name,

	S.Logdate

FROM A, S

WHERE A.ID = S.AID(+)

  AND S.EID(+) = 1

  AND S.ID IN (SELECT MAX(ID) FROM S WHERE EID = 1 GROUP BY AID)

  AND CID LIKE '1'

UNION

SELECT	A.ID,

	A.Name,

	null  

FROM A

WHERE CID = 1 

  AND A.ID NOT in (SELECT AID FROM S WHERE EID = 1)

ORDER BY CID, Name



Also nochmals: DANKE!!!!! :hodata

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von loeti

Unter http://www.dba-oracle.com/art_sql_iso_99.htm kann man nachlesen, dass left outer joins das (+) in der rechten Spalte benötigen, nicht in der linken. Das war dann wohl der Fehler.

Tut mir leid Dich enttäuschen zu müssen. Auch wenn die (+) in der rechten Spalte sind, liefert Oracle nicht das gewünschte Ergebnis. Nur der "Union"-Select liefert auch die Sätze ohne Logdate.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...