Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Brauche hilfe bei SQL-Statement (https://www.delphipraxis.net/160653-brauche-hilfe-bei-sql-statement.html)

Jumpy 24. Mai 2011 15:26

Datenbank: SQL Server • Version: 2008 • Zugriff über: TADOQuery

Brauche hilfe bei SQL-Statement
 
Hallo,

ich habe vereinfachend eine Tabelle (Results) in der Namen (eigntl. IDs) von Programmen und die von den Programmen erzeugten Ergebnisdateien gespeichert sind. Mir geht es nun darum herauszufinden, welche Arten von Datei erzeugt werden. Dazu schneide ich einfach die Endung raus und habe z.B. folgende Tabelle:
Code:
P_ID Dateiendung
1111  PDF
1111  PDF
1111  XLS
1111  DOC
1111  DOC
1234  XLS
1234  XLS
2233  XLS
2233  DOC
Darauf ein Distinct:
Code:
P_ID Dateiendung
1111  PDF
1111  XLS
1111  DOC
1234  XLS
2233  XLS
2233  DOC
Was ich nun haben möchte:
Code:
P_ID Dateiendungen
1111  PDF, XLS, DOC
1234  XLS
2233  XLS, DOC
Dieser letzte Schritt ist das Problem, wie kriege ich das hin (mit SQL).
Falls der Dialekt wichtig ist, ausnahmsweise mal nicht Oracle sondern SQLServer.

DeddyH 24. Mai 2011 15:32

AW: Brauche hilfe bei SQL-Statement
 
Schau einmal hier: http://blog.shlomoid.com/2008/11/emu...-function.html

p80286 24. Mai 2011 15:40

AW: Brauche hilfe bei SQL-Statement
 
Ich nutze für solche Sachen eine Function (oracle)

Gruß
K-H

Stevie 24. Mai 2011 15:43

AW: Brauche hilfe bei SQL-Statement
 
Ich würde den Ansatz mit der CTE bevorzugen.

DeddyH 24. Mai 2011 15:47

AW: Brauche hilfe bei SQL-Statement
 
Oder zu MySQL wechseln und einfach GROUP_CONCAT benutzen :stupid:

mkinzler 24. Mai 2011 15:52

AW: Brauche hilfe bei SQL-Statement
 
Oder zu FireBird (List())

Jumpy 24. Mai 2011 15:57

AW: Brauche hilfe bei SQL-Statement
 
Da ich auf die DB keinen Einfluss habe schau ich mir die anderen Varianten mal näher an.....morgen, denn es ist Feierabend! Danke euch.

Jumpy 25. Mai 2011 15:17

AW: Brauche hilfe bei SQL-Statement
 
Hat sich leider herausgestellt, dass mein Chefe sich vertan hat und die Daten doch von einer Oracle DB kommen. Dank des Stichwortes Group_Concat aus euren Links bin ich dann auf vergleichbares für Oracle gestoßen. Hab beide im folgenden Link vorgstellten Verfahren ausprobiert und beide funktionieren. Die XML-Variante kommt mir auch schneller vor.

http://pacmann.over-blog.com/article-34900054.html

Ich würde das Ergebnis ja hier posten, aber das SQL-Statement ist megaunübersichtlich geworden, da ich die vorgestellten Verfahren nicht auf eine Tabelle anwende, sondern auf einen üblen Subselect, und das will ich keinem antun.

Danke nochmal für die Links, die mir gezeigt haben, wonach ich eingentlich suche:thumb:

p80286 25. Mai 2011 16:23

AW: Brauche hilfe bei SQL-Statement
 
Zitat:

Zitat von Jumpy (Beitrag 1102870)
Ich würde das Ergebnis ja hier posten, aber das SQL-Statement ist megaunübersichtlich geworden, da ich die vorgestellten Verfahren nicht auf eine Tabelle anwende, sondern auf einen üblen Subselect, und das will ich keinem antun.

Wie wär es mit einem View?
Gruß
K-H

Jumpy 25. Mai 2011 21:02

AW: Brauche hilfe bei SQL-Statement
 
Thema View! Werd ich wahrsch. auch machen, damit das SQL-Statement in dem Programm, wo ich es brauche nicht so chaotisch ist.

Hätte das auch performance Vorteile? Ist eine View schneller als eine Abfrage? Ist eine View letztlich nicht auch nur ein gespeichertes SQL-Statement, das bei Selects auf die View ausgeführt wird.

haentschman 25. Mai 2011 21:10

AW: Brauche hilfe bei SQL-Statement
 
Zitat:

Ist eine View letztlich nicht auch nur ein gespeichertes SQL-Statement, das bei Selects auf die View ausgeführt wird.
ja sicher.
Edit: Blödsinn entfernt...

jobo 25. Mai 2011 22:01

AW: Brauche hilfe bei SQL-Statement
 
Ja, ein View ist zunächst nur gespeichertes SQL.

Ein View ist aber auch ein gespeicherter Zusammenhang zwischen Objekten. Der kann z.B. zerstört werden durch DML und man bekommt es angezeigt (als Admin, wenn ein View betroffen ist), die Zusammenhänge und die Fehler durch Abhängigkeit. Der View kann ein Interface darstellen und und und ..
und er kann angenehm aussehen, wie eine Tabelle. (das kann aber auch irritieren) :)

Zum eigentlichen Thema, statisch kann man in Oracle je nach Version sicher mit XML Funktion oder mit Pivot arbeiten. Dynamisch empfiehlt sich seit einigen Versionen die Funktion rowtocol.

z.B. so
Pivot
rowtocol

Jumpy 26. Mai 2011 09:57

AW: Brauche hilfe bei SQL-Statement
 
Zitat:

Zitat von jobo (Beitrag 1102943)
Zum eigentlichen Thema, statisch kann man in Oracle je nach Version sicher mit XML Funktion oder mit Pivot arbeiten. Dynamisch empfiehlt sich seit einigen Versionen die Funktion rowtocol.

1. Für mein Verständnis: Was meinst du in dem Zusammenhang mit statisch und dynamisch?
2. rowtocol muss ich aber zuvor als Datenbakfunktion anlegen, oder?

Und danke für die Links, da gibt es ja noch zig Möglichkeiten, wie man das machen kann.

P.S.: Ein Nachteil einer View (und auch einer Datenbankfunktion) ist mir gerade eingefallen. Wenn irgendein aufräumwütiger Admin da drüber stolpert und denkt "Hat der Azubi gemacht? schon vor 2 Monaten? Braucht keiner - Weg damit", läuft auf einmal das Programm nicht mehr.:-D

p80286 26. Mai 2011 10:00

AW: Brauche hilfe bei SQL-Statement
 
Zitat:

Zitat von jobo (Beitrag 1102943)
Dynamisch empfiehlt sich seit einigen Versionen die Funktion rowtocol.

Zum besseren Verständnis, ist ROWTOCOL eine Standardfunktion, oder muß ich sie erst implementieren?

Code:
  8  ;
      ,rowtocol('select tableevent.Eventcode
       *
ERROR at line 2:
ORA-00904: "ROWTOCOL": invalid identifier

jobo 26. Mai 2011 11:33

AW: Brauche hilfe bei SQL-Statement
 
rowtocol muss als Funktion - so wie in dem Link aufgeführt- eingespielt werden. Wahlweise ginge es auch als Package Funktion.
Es gibt glaub ich verschiedene Varianten davon, Orginial stammt aus Ask Tom.
Die Funktion lässt sich "dynamisch" verwenden, das Select wird ja als String-Parameter mitgegeben. Das ist natürlich bequem, hat aber den Nachteil, dass man keine bind variables nutzen kann.

Die Pivot Variante ist "statisch", du musst ein festes SQL angeben. In einem Client, kannst Du das natürlich auch beliebig zusammensetzten (und mit bind variables bestücken) in einem View ist es statisch. Das ist aber ja nicht ungewöhnlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz