Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Abfrage: Tabelle mit variabler Zeilen- und Spaltenanzahl und verschiedenen Zellenelementen
dahaack
myCSharp.de - Member



Dabei seit:
Beiträge: 48

Themenstarter:

Abfrage: Tabelle mit variabler Zeilen- und Spaltenanzahl und verschiedenen Zellenelementen

beantworten | zitieren | melden

Datenbanksystem: MySQL


Hallo,

ich habe wie in der überschrift genannt eine Tabelle mit variabler Zeilen- und Spaltenanzahl und verschiedenen Zellenelementen. Es gibt über 100 Spalten und 100 Zeilen.

Diese Tabelle wird aus 3 Tabellen zusamengebastelt. Hier eine vereinfachte Version:
create table t_Row
(
    rowId int unsigned not null auto_increment,
    rowName varchar(30),
    primary key(rowId)
);

create table t_Column
(
    columnId int unsigned not null auto_increment,
    columnName varchar(30),
    primary key(columnId)
);

create table t_Cell
(
    cellId int unsigned not null auto_increment,
    columnId int unsigned not null,
    rowId int unsigned not null,
    cellContent varchar(30),
    cellProperty varchar(30),
    foreign key(columnId) references t_Column(columnId),
    foreign key(rowId) references t_Row(rowId),
    primary key(cellId)
);


Es gibt jedoch nicht für jede Zelle auch einen Eintrag. Es gibt zum Beispiel 2 Zeilen, 2 Spalten, jedoch nur 3 Zelleninhalte:
insert into t_Row(rowName) values ('Row 1');
insert into t_Row(rowName) values ('Row 2');

insert into t_Column(columnName) values ('Column 1');
insert into t_Column(columnName) values ('Column 2');


insert into t_Cell(rowId, columnId, cellContent, cellProperty)
values(1, 1, 'Content 1,1', 'Property 1,1');

insert into t_Cell(rowId, columnId, cellContent, cellProperty)
values(2, 1, 'Content 2,1', 'Property 2,1');

insert into t_Cell(rowId, columnId, cellContent, cellProperty)
values(2, 2, 'Content 2,2', 'Property 2,2');


Nun möchte ich per Abfrage die eigentliche Tabelle erhalten (es reicht erstmal nur den 'Content' oder nur die 'Property' anzuzeigen). Nicht vorhandene Einträge sollen den Wert NULL bekommen.


Leider waren SQL Abfragen noch nie mein Fachgebiet, und ich hoffe, dass mir jemand von Euch bei diesem Problem weiterhelfen kann.

Die vermutlich ersten 4 Wörter der Abfrage kenne ich jedoch bereits:
select cellContent from t_Cell

Wie es jedoch dann mit dem LEFT JOIN, EQUI JOIN, sonstwas JOIN und sonsitgen Tricksereien und Unterabfragen weitergeht, weiß ich nicht.

Das Ergebnis sollte also etwa so aussehen:
'Content 1,1'     NULL
'Content 2,1'     'Content 2,2'


Vielen Dank im Voraus!
private Nachricht | Beiträge des Benutzers
vbprogger
myCSharp.de - Experte

Avatar #avatar-1820.gif


Dabei seit:
Beiträge: 1723
Herkunft: NRW/DE

beantworten | zitieren | melden

Hallo,

Eine JOIN Abfrage läßt sich nicht vermeiden, wenn du mit SQL zu tun hast. Wenn du dich also ernsthaft mit Datenbankanwendung anfangen möchtest, dann musst du dich damit beschäftigen. Das kann man dir keiner abnehmen. Wir können dir nur bei komplexen Probleme Hilfestellung leisten, im Sinne von Hilfe zur Selbsthilfe, aber nicht bei Grundlagenprobleme.

Grüße
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von vbprogger am .
Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.
---------
Bemerkung: ich beantworte keine Fragen via PM, denn das Forum soll ja was davon haben!
private Nachricht | Beiträge des Benutzers
dahaack
myCSharp.de - Member



Dabei seit:
Beiträge: 48

Themenstarter:

beantworten | zitieren | melden

Hallo vbprogger,

handelt es sich hierbei denn tatsächlich um ein Grundlagenproblem?

Dass bei einer "sinnvollen" Abfrage, bei der Daten aus mehreren Tabellen zusammengefügt werden, der JOIN Befehl benutzt werden muss, ist mir auch klar.


Meine Tabelle hat ja eine variable Anzahl an Spalten, daher seh ich erstmal keine andere Möglichkeit, als mit einer übergeordneten Programmiersprache den Befehl zusammenzubasteln. Dies würde wohl in etwa so aussehen:

string[] columnNameArray = Mysql.SelectStringArray("select columnName from t_Column");
string query = "SELECT columnName as '"+ columnNameArray[0] + "'";
for(int i=1;i<columnNameArray.Count;i++)
{
    query += ", columnName as '"+ columnNameArray[i] + "'"
}
query += " from t_Cell";


Nun müsste ich ja nochmal jede einzelne Spalte in SQL durchgehen. Keine Ahnung, ob das überhaupt geht.

Ich habe den kompletten Befehl schon mithilfe von C# gelöst, indem ich einfach jede einzelne Spalte und darin wieder jede einzelne Zeile durchgegangen bin, und mir die entsprechende Zelle rausgeholt habe. Dieser Algorithmus dauert jedoch Ewigkeiten.

Meine Hoffnung war, dass jemand einen Indianertrick kennt, mit dem man das ganze mit deutlich weniger Rechenaufwand lösen kann.
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1626
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

Hallo dahaack,

sieh dir mal das Entity Framework bzw nHibernate an. Deine Wünsche klingen sehr nach O/R-Mappers.

Gruß,
Michael
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
dahaack
myCSharp.de - Member



Dabei seit:
Beiträge: 48

Themenstarter:

beantworten | zitieren | melden

Hallo xxMUROxx,

danke für den Hinweis! Werd mir das ganze mal anschauen.

Viele Grüße
private Nachricht | Beiträge des Benutzers
mikefried
myCSharp.de - Member



Dabei seit:
Beiträge: 201

beantworten | zitieren | melden

Also die Spalten der Tabelle stehen beim SQL Server in einer Systemtabelle, wenn man den richtigen Eintrag hat, könnte man dann vielleicht mit foreach einen dynamischen abfragestring bauen?
private Nachricht | Beiträge des Benutzers