![]() |
Datenbank: Firebird • Version: 2,5 • Zugriff über: IBDAC
SQL-Abfrage: Ansatz gesucht
Hallo,
nach längerer Programmierpause beschäftigt mich ein SQL-Problem bei dem ich nicht weiß wie ich es angehen soll: In einer Projektcheckliste sollen Merkmalswerte eines oder mehrerer Objekte gespeichert werden. Die Tabelle könnte so aussehen: bezug___objekt__merkmal_wert ---------------------------- 4711____1_______a_______x1 4711____1_______b_______y1 4711____1_______c_______z1 4711____2_______a_______x2 4711____2_______b_______y2 4711____2_______c_______z2 4711____2_______d_______zz2 4711____3_______b_______y3 4711____3_______c_______z3 Das Abfrageergebnis soll so aussehen: bezug merkmal werte_der_objekte ---------------------------------- 4711____a_______x1______x2 4711____b_______y1______y2______y3 4711____c_______z1______z2______z3 4711____d_______________zz2 Jetzt das Problem: Die Anzahl der Objekte pro bezug liegt zwischen 1 und 6 (also variable Spaltenzahl) die Anzahl der Merkmale zwischen 20 und 40. Nicht jedes Objekt muss alle Merkmale enthalten. Kann man das in einer einzelnen Abfrage darstellen? |
AW: SQL-Abfrage: Ansatz gesucht
Das wäre eine Pivotabfrage, geht mit FB noch nicht.
Wenn die Anzahl der Merkmale bzw. zusätzlichen Spalten statisch ist, dann kann man das mit Case When prüfen (Datensatz vorhanden/bestimmter Inhalt gesetzt?) und als virtuelle Spalten ausgeben. |
AW: SQL-Abfrage: Ansatz gesucht
Hallo,
geht schon, mit einer Stored Procedure. Heiko |
AW: SQL-Abfrage: Ansatz gesucht
Aber auch nur wenn die Anzahl der Spalten bekannt ist
|
AW: SQL-Abfrage: Ansatz gesucht
Hallo,
ich hätte die jetzt mit Komma getrennt statt einzelne Spalten zu nehmen ... Aber zusammenbauen kann man das auch ohne die Anzahl zu wissen, zuerst alle Distinct-Werte holen, zwischenspeichern und dann für jedes Distinct-Projekt auslesen. Ist aber aufwendig. Aber: Bekommt man das mit CTE's nicht sogar in einer Query hin??? Heiko |
AW: SQL-Abfrage: Ansatz gesucht
Ich hätte jetzt eine Lösung wie du die mehreren Zeilen in einer Zeile mit Kommas getrennt ausgibst...
Code:
SELECT stuff((
SELECT ', ' + cast(Wert as varchar(max)) FROM Tabelle Where bezug = 4711 FOR XML PATH('') ), 1, 2, ''); |
AW: SQL-Abfrage: Ansatz gesucht
Ich hatte so ein ähnliches Problem in meinem aktuellen Projekt auch. Habe das damit gelöst, dass ich die Objekte als JSONs in die Datenbank geschrieben habe, das hat wunderbar funktioniert.
|
AW: SQL-Abfrage: Ansatz gesucht
Also es gibt ja mehr oder weniger 2 Varianten
- zentrale Bereitstellung eines (halb)dynamischen Verfahrens / Query - lokale, also clientseitge Abfrage Für den ersten Fall muss man mit den gegebenen Möglichkeiten einige Einschränkungen in Kauf nehmen. Im 2. Fall kann man aber relativ flexibel agieren, wenn man die Query selbst dynamisch zusammenstellt. Hier wären es die Objekte, die jenachdem zusammenzustellen (Liste) wären. Anhand derer kann man dann in einem Query Template entsprechende Case When Spalten einfügen, die für jedes Objekt eine Spalte ausspucken. |
AW: SQL-Abfrage: Ansatz gesucht
Also in MySQL gibt es die Funktion
![]() In Firebird gibt's das wohl auch ab Version 2.1. Dort heißt die Funktion ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz