URL: https://www.overclockers.at/coding-stuff/sql-profis-with-innerhalb-where-exists_226680/page_1 - zur Vollversion wechseln!
Im Zuge einer Umstellung von Oracle auf MS SQL Server versuche ih hier eine Hierarchie aufzulösen.Code: SQLSELECT ... ghp, .., gpnr, GPID, ...... verdammtvieles FROM gruppen G1 WHERE projektnr = 10460 AND vorzeichen = 'P' AND pversion = ' ' AND mandant = 1 AND GHP = 0 AND GPID LIKE 'FED%' AND EXISTS( WITH n(gpid) as ( SELECT gpid FROM GRUPPEN G2 WHERE PROJEKTNR= 10460 AND GPID LIKE 'PA%' UNION ALL SELECT gpid FROM GRUPPEN G3 WHERE GHP = 0 AND POSNR = GHP ) SELECT 1 FROM n) ORDER BY 12, Sortier_nr, gpid;
Und warum löst du das WITH nicht einfach als Subselect auf und näherst dich an ANSI ran?
btw. das ist kein SQL Problem sondern der typische Fall wenn man von einem DBMS den gesamten Facettenreichtum ausreizen will und sich jenseits jedes Standards bewegt :/
pong
Das Problem ist, die ursprüngliche Oracle Query ist vermutlich über 10 Jahre alt.
Es werden hier rekursiv Tabellen mit sich selbst verglichen (die Query ist schon vereinfacht).
Als Programmierer und weniger DB-Spezialist würd ich den Schas ja gern auscodieren, aber bei den Datenmengen, die da geschaufelt werden steht das ausser Frage.
Insofern versteh ich den Programmierer, der vor 10 Jahren das Statement reingeklopft hat, in dem todsicheren Wissen dass es sowieso niemals eine andere Enterprise-DB geben wird als Oracle
Und von "(ANSI)Standards" brauch ich in dem Business gar nicht anfangen. In der realen Welt ist der Standard ein feuchter Sommertraum mancher Weltverbesserer
Aber ja, es scheint eh keine andere Möglichkeit zu geben als das WITH aufzulösen oder vorher die Daten der Subselects in ne temporäre View zu schiessen..
// Ach ja, gerade nachgesehen .. WITH ist sogar ne ANSI-SQL Funktion. Wundert mich umso mehr dass der SQL Server die Klausel nicht innerhalb des WHERE EXISTS zulässt..
Evt. das With ganz an den Anfang vors erste Select.
Schau mal in der MSSql Hilfe unter Common Table Expressions
Werden Stored Procedures bei euch zugelassen? Darfst temporäre Tabellen verwenden?
Dieser rekursive ****** gehört zu den Dingen auf dieser Welt die einfach verboten werden sollten. //sorry für die Bemerkung, ist aber so.
Wenn ich morgen oder am Weekend Zeit hab, versuch ichs dir aufzuschlüsseln.
pong
Bekommst du nicht bei der Ausführen die Warnung dass vor einem WITH ein semikolon stehen muss?
Hi!
Ich seh keinen Grund warum du hier ein with benötigen würdest, oder überseh ich was?
Code: SQLselect somefoo from gruppen g1 WHERE projektnr = 10460 AND vorzeichen = 'P' AND pversion = ' ' AND mandant = 1 AND GHP = 0 AND GPID LIKE 'FED%' and exists (select 1 from gruppen g2 where g1.projektnr = g2.projektnr and g2.gpid like 'PA%' union all select 1 from gruppen g3 where g3.ghp = 0 and g3.posnr = g3.ghp -- ?? )
Danke, ich habs jetzt schlussendlich so gelöst.Zitat von pongWerden Stored Procedures bei euch zugelassen? Darfst temporäre Tabellen verwenden?
Dieser rekursive ****** gehört zu den Dingen auf dieser Welt die einfach verboten werden sollten. //sorry für die Bemerkung, ist aber so.
Wenn ich morgen oder am Weekend Zeit hab, versuch ichs dir aufzuschlüsseln.
pong
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025