attribute innerhalb einer zeile selektieren
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
attribut
benutzername
bezeichnung
code
cursor
datum
index
mitarbeiter
nachname
not
null
ordern
ort
papierform
schleife
spalten
tabelle
vertrag
vorname
zeichen
-
Hallo,
ich arbeite zwar unter ms-sql, trotzdem denke ich kann ich meine frage im mysql forum stellen, da es sich nicht um eine syntax frage handelt. Also dann mal los..
Erstmal eine kurze erklärung der Datenbankstruktur und zur Benutzung:
Den benutzern steht eine Weboberfläche zur verfügung in der sie verschiedenen Daten erfassen können. Zb vorname, nachname, ort usw. Diese Daten werden in der Datenbank gespeichert und müssen später exportiert werden. Um das einlesen der exportierten daten zu gewährleisten werden die daten in einem bestimmten format exportiert. Hier hat jedes Atrribut, wie zb name, vorname, ort usw. einen start index sowie einen maximale zeichenlänge. der attribut wert steht also immer an der gleichen stelle in der textdatei. der name beginnt beispielsweise immer an stelle 1 und ist 20 zeichen lang. ab stelle 21 beginnt dann der vorname. übrige zeichen werden mit leerstellen aufgefüllt.
soviel dazu
um das ganze dynamisch zu gestalten, da immer wieder attribute hinzukommen oder entfernt werden, gibt es in der datenbank eine tabelle namens formularfeld, in der die attribute mit namen, start index und länge gespeichert sind.
die benutzer erfassen nun also über die weboberfläche verträge. jeder vertrag kann über unterschiedliche attribute verfügen. dh ich habe eine tabelle vertrag, in der eine mitarbeiterID und eine vertragID gespeichert wird. außerdem habe ich eine tabelle VertragZUFormularfeld, indem die VertragsID, die FormularfeldID und der eingegebene Wert gespeichert wird. So ist jedem Vertrag ein Mitarbeiter und eine variable anzahl an Attributen wie name, vorname, ort usw zugeordnet.
Nun das Problem:
ich möchte jeden Vertrag innerhalb einer Zeile selektieren. Also mit X spalten, wobei X gleich die anzahl aller benutzen Attribute ist. zb:
vertagid: 1 vorname: max nachname: mustermann ort:musterort
hier meine beispielprozedur:
1. ich erstelle zunächst eine temporäre tabelle mit den spalten vertragid mitarbeiterid und sonstigen uninteressanten werten
2.in einer schleife selektiere ich alle verträge
3.innerhalb dieser schleife selektiere ich alle attribute
4.falls das selektierte attribut noch nicht in der temporären vorhanden ist, wird es hinzugefügt.
5.der wert des attributes wird anhand der vertragsid selektiert und in der temporären tabelle gespeichert
6.attributen schleife beenden
7. vertragsschleife beenden
hier mal der code für die, die meine merkwürdige ausdrucksweise nicht verstehen:
ALTER PROCEDURE [dbo].[get_Exports_neu] AS BEGIN SET NOCOUNT ON; DECLARE @Wert as nvarchar(255) DECLARE @Wert2 as nvarchar(255) DECLARE @Wert3 as nvarchar(255) DECLARE @Wert4 as nvarchar(255) DECLARE @Wert5 as nvarchar(255) DECLARE @SQL as nvarchar(MAX) SELECT @SQL = 'CREATE TABLE ##tempVerträge([ID] [int] IDENTITY(1,1) NOT NULL,[Vertrag_ID] [int] NOT NULL,[Mitarbeiter] nvarchar(MAX) not null,[Mitarbeiter_ID] [int],[Papierform liegt vor] [bit])' EXEC (@SQL) DECLARE C_Vertrag CURSOR FOR SELECT dbo.Vertrag.Vertrag_ID, dbo.Mitarbeiter.Benutzername,dbo.Mitarbeiter.Mitarbeiter_ID,dbo.Vertrag.Papierform FROM dbo.Vertrag INNER JOIN dbo.Mitarbeiter ON dbo.Vertrag.Mitarbeiter_ID = dbo.Mitarbeiter.Mitarbeiter_ID WHERE export = 1 GROUP BY dbo.Vertrag.Vertrag_ID, dbo.Mitarbeiter.Benutzername,dbo.Mitarbeiter.Mitarbeiter_ID,dbo.Vertrag.Papierform ORDER BY dbo.Vertrag.Vertrag_ID OPEN C_Vertrag ; FETCH NEXT FROM C_Vertrag into @Wert,@Wert2,@Wert3,@Wert4 WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO ##tempVerträge (Vertrag_ID,Mitarbeiter,Mitarbeiter_ID,[Papierform liegt vor]) VALUES (@Wert,@Wert2,@Wert3,@Wert4) DECLARE C_Werte CURSOR FOR SELECT Bezeichnung FROM dbo.Formularfeld JOIN Formularfeld_zu_Vertrag on Formularfeld_zu_Vertrag.Vertrag_ID = @Wert GROUP BY Bezeichnung ORDER BY Bezeichnung OPEN C_Werte; FETCH NEXT FROM C_Werte into @Wert5 WHILE @@FETCH_STATUS = 0 BEGIN if NOT EXISTS(select * from tempdb.sys.columns where object_id = object_id('tempdb..##tempVerträge') and name = @Wert5) BEGIN SELECT @SQL = 'ALTER TABLE ##tempVerträge ADD ['+@Wert5+'] nvarchar(MAX)' EXEC (@SQL) END SELECT @SQL = 'UPDATE ##tempVerträge SET [' +@Wert5+'] = (SELECT TOP(1) dbo.Formularfeld_zu_Vertrag.Wert FROM dbo.Formularfeld_zu_Vertrag INNER JOIN dbo.Formularfeld ON dbo.Formularfeld_zu_Vertrag.Formularfeld_ID = dbo.Formularfeld.Formularfeld_ID WHERE Vertrag_ID='+@Wert+' AND Bezeichnung ='''+@Wert5+''') WHERE Vertrag_ID='+@Wert EXEC (@SQL) FETCH NEXT FROM C_Werte into @Wert5 END CLOSE C_Werte DEALLOCATE C_Werte FETCH NEXT FROM C_Vertrag into @Wert,@Wert2,@Wert3,@Wert4 END CLOSE C_Vertrag DEALLOCATE C_Vertrag SELECT * FROM ##tempVerträge DROP TABLE ##tempVerträge END
das ganze ist leider sehr sehr langsam, da ich für 20 verträge ca. 700 selektionen mache oO
ich würde mich also über eine performantere version freuen -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage