Laden...

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

Erstellt von dahaack vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.321 Views
D
dahaack Themenstarter:in
47 Beiträge seit 2011
vor 11 Jahren
Abfrage: Tabelle mit variabler Zeilen- und Spaltenanzahl und verschiedenen Zellenelementen

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!

1.696 Beiträge seit 2006
vor 11 Jahren

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

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

D
dahaack Themenstarter:in
47 Beiträge seit 2011
vor 11 Jahren

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.

1.552 Beiträge seit 2010
vor 11 Jahren

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

D
dahaack Themenstarter:in
47 Beiträge seit 2011
vor 11 Jahren

Hallo xxMUROxx,

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

Viele Grüße

M
198 Beiträge seit 2010
vor 11 Jahren

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?