Yakuzza Geschrieben 3. Juli 2003 Teilen Geschrieben 3. Juli 2003 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!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
beetFreeQ Geschrieben 3. Juli 2003 Teilen Geschrieben 3. Juli 2003 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Yakuzza Geschrieben 3. Juli 2003 Autor Teilen Geschrieben 3. Juli 2003 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: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
HolzOnkel Geschrieben 4. Juli 2003 Teilen Geschrieben 4. Juli 2003 ...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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Yakuzza Geschrieben 4. Juli 2003 Autor Teilen Geschrieben 4. Juli 2003 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...) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Yakuzza Geschrieben 4. Juli 2003 Autor Teilen Geschrieben 4. Juli 2003 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
loeti Geschrieben 9. Juli 2003 Teilen Geschrieben 9. Juli 2003 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Yakuzza Geschrieben 11. Juli 2003 Autor Teilen Geschrieben 11. Juli 2003 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.