Verknüpfung mit einer Tabelle von drei möglichen

Du kannst Dir gern sowas wünschen

Was ist das den für eine Antwort? Mir zu sagen das du keinen befehl dafür kennst reicht doch?!

Und wie du an ukulele siehst scheint es ja doch einen weg zu geben:

Naja du kannst schon ein SQL Script basteln aber in einer Abfrage geht es definitiv nicht.
Code:
DECLARE    @tabelle VARCHAR(20),
        @char VARCHAR(255)
 
SELECT    @tabelle = u.Network
FROM    [User] u
WHERE    u.id = 123
 
SET        @char = '
SELECT    login
FROM    ' + @tabelle
 
EXEC    @char
Du fragst erst den Inhalt der Spalte mit dem Dienstnamen ab, schreibst ihn in eine Variable, erzeugst das SQL Statement als String (vorsicht, SQL Injection möglich!) und führst das mit EXEC aus.


Vielen Dank ukulele, das ist genau was ich wissen wollte!
 
Werbung:
Das kannst du aber auch in der Anwendung abbilden. Wichtig ist das du innerhalb eines SQL Statements nie einen Spalteninhalt als Spalten- / Tabellennamen verwenden können wirst, daran habe ich mir leider auch schon die Zähne ausgebissen. Der Umweg über dynamisches SQL mit EXEC hingegen ist die einzige Methode...
 
Was ist das den für eine Antwort? Mir zu sagen das du keinen befehl dafür kennst reicht doch?!
Und wie du an ukulele siehst scheint es ja doch einen weg zu geben:

Ja, und? Ukulele hat es nicht in SQL gemacht, sondern in einer Programmiersprache innerhalb der DB. Ich bin mir nicht sicher, ob das nun M$SQL oder MySQL war/ist, jedenfalls aber kein reines SQL. Hätte ich Dir auch in pl/pgsql zeigen können, kein Ding. Es gäbe sogar eine reine SQL-Lösung: Table-Inheritance. Aber alle jetzt genannten Lösungen verschlimmern nur Dein Problem, weil der Aufwand via solch einer Funktion und auch via Table-Inheritance bei den Datenmengen, die bei Dir wohl auflaufen werden, größer ist als eine saubere Lösung, wie ich es Dir schon gezeigt habe.

Man kann immer etwas komplizierter lösen als nötig. Muß man aber nicht.
 
Wichtig ist das du innerhalb eines SQL Statements nie einen Spalteninhalt als Spalten- / Tabellennamen verwenden können wirst, daran habe ich mir leider auch schon die Zähne ausgebissen. Der Umweg über dynamisches SQL mit EXEC hingegen ist die einzige Methode...

Um mal das von mir schon genannte Inheritance zu zeigen:

Code:
test=# create table soc_media(id serial primary key, name text);
NOTICE:  CREATE TABLE will create implicit sequence "soc_media_id_seq" for serial column "soc_media.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "soc_media_pkey" for table "soc_media"
CREATE TABLE
Time: 5,136 ms
test=*# create table facebook() inherits (soc_media);
CREATE TABLE
Time: 73,675 ms
test=*# create table google() inherits (soc_media);
CREATE TABLE
Time: 21,820 ms
test=*# create table linkedin() inherits (soc_media);
CREATE TABLE
Time: 3,375 ms
test=*# insert into facebook (name) values ('hans');
INSERT 0 1
Time: 0,383 ms
test=*# insert into google (name) values ('peter');
INSERT 0 1
Time: 0,356 ms
test=*# insert into linkedin (name) values ('uwe');
INSERT 0 1
Time: 0,334 ms
test=*# select * from soc_media;
 id | name
----+-------
  1 | hans
  2 | peter
  3 | uwe
(3 rows)

Mal als unvollständiger Ansatz, da fehlen noch so Dinge wie ein TRIGGER auf die Haupttabelle, damit Inserts auf die Haupttabelle in der richtigen Kindtabelle landen.
Solch ein Table-Partitioning lohnt aber auch erst dann, wenn die Kindtabellen jeweils Millionen von Zeilen haben, vorher nicht. Dann aber kann man faktisch beliebig viele Kindtabellen anlegen und kann dennoch, wenn mal die Haupttabelle abfragt, einen Überblick über alles haben. Zusammen mit passenden Indexen und EXCLUSION CONSTRAINTS läuft das dann auch flott.

Ein Kunde von uns z.B. hat pro Tag 5-10 Millionen Inserts, die Daten müssen/sollen mind. 3 Jahre im Zugriff sein. Da lohnt es sich, beim Fragesteller sehr sicher nicht.
 
Werbung:
OK Vielen Dank für deine Mühe, das sieht dann schon etwas komplizierter aus.

Auch wenn du mich jetzt verfluchen wirst, aber ich werde dann wohl tatsächlich lieber meine Facebook, Google ... Tabellen in eine SocialNetwork Tabelle packen :D

Der Nachteil dabei ist natürlich nur, wenn ich eine Spalte nur für Facebook User habe, das ich Sie für Google etc. ebenfalls füllen muss...
 
Zurück
Oben