Unterabfrage zum Abrufen des Tabellennamens

Ich habe eine Frage wie folgt:

SELECT * FROM (SELECT linktable FROM adm_linkedfields WHERE name = 'company') as cbo WHERE group='BEST' 

Grundsätzlich wird der Tabellenname für die Hauptabfrage durch die Unterabfrage geholt.

Ich bekomme einen Fehler, dass #1054 - Unknown column 'group' in 'where clause'

Wenn ich untersuche (das Entfernen der where-Klausel), finde ich, dass die Abfrage nur das Unterabfrageergebnis jederzeit zurückgibt.

Unterabfrage-Tabelle adm_linkedfields hat Struktur- id | name | linktable id | name | linktable

Derzeit bin ich mit MySQL mit PDO, aber die Abfrage sollte mit großen DBs (VO Oracle, MSSQL, PgSQL und MySQL)

Update: Die Unterabfrage sollte den Namen der Tabelle für die Hauptabfrage zurückgeben. In diesem Fall wird es tbl_company

Die Tabelle tbl_company für die Hauptabfrage hat diese Struktur: id | name | group id | name | group

Danke im Voraus.

Dynamic SQL funktioniert nicht so, was Sie erstellt haben, ist eine Inline-View, lesen Sie auf, dass. Was ist mehr, können Sie nicht erstellen eine dynamische SQL-Abfrage, die auf jedem db arbeiten wird. Wenn Sie eine begrenzte Anzahl von linktables haben, können Sie versuchen, Links-Joins oder Gewerkschaften aus allen Tabellen auszuwählen, aber wenn Sie nicht einen guten Grund haben, dass Sie das nicht wollen. Wählen Sie einfach den Tablename in einer Abfrage aus und dann noch einen anderen, um auf die richtige Tabelle zuzugreifen (indem Sie die Abfragezeichenfolge in PHP erstellen).

Hier ist ein Problem:

 SELECT * FROM (SELECT linktable FROM adm_linkedfields WHERE name = 'company') as cbo WHERE group='BEST'; 

Sie wählen aus DT, die nur eine Spalte "linktable" enthält, dann können Sie keine andere Spalte in wo Klausel des äußeren Blocks setzen. Denken Sie in Form von Blöcken die äußere Auswahl bezieht sich auf eine DT, die nur eine Spalte enthält.

Ihr Problem ist ähnlich, wenn Sie versuchen zu tun:

 create table t1(x1 int); select * from t1 where z1 = 7; //error 

Ihre Anfrage ist:

 SELECT * FROM (SELECT linktable FROM adm_linkedfields WHERE name = 'company' ) cbo WHERE group='BEST' 

Zuerst, wenn Sie sich für eine übergreifende Kompatibilität interessieren, benennen Sie keine Spalten oder Tabellen nach SQL reservierten Wörtern. group ist ein wirklich, wirklich schlechter Name für eine Spalte.

Zweitens gibt die Klausel eine Tabelle zurück, die eine list von Namen (von Tabellen enthält, aber das ist irrelevant). Es gibt keine Spalte namens group , also das ist das Problem, das du hast.

Was können Sie tun, um das zu beheben? Eine naive Lösung wäre, die Unterabfrage auszuführen, es auszuführen und den resultierenden Tabellennamen in einer dynamischen statement zu verwenden, um die gewünschte Abfrage auszuführen.

Das grundlegende Problem ist Ihre datastruktur. Mit mehreren Tischen mit der gleichen Struktur ist in der Regel ein character für ein schlechtes Design. Sie haben grundsätzlich zwei Möglichkeiten.

Eins. Wenn Sie die Kontrolle über die database-Struktur haben, setzen Sie alle data in einer einzigen Tabelle, linktable zum Beispiel. Dies würde die Informationen für alle Unternehmen und eine Spalte für group (oder was auch immer Sie umbenennen). Diese Lösung ist über alle databaseen hinweg kompatibel. Wenn Sie Lose und viele data in den Tischen haben (denken Sie zehn Millionen Zeilen), dann denken Sie vielleicht an die Partitionierung der data aus Performance-Gründen.

Zwei. Wenn Sie keine Kontrolle über die data haben, erstellen Sie eine view, die alle Tabellen zusammen verkettet. Etwas wie:

 create view vw_linktable as select 'table1' as which, t.* from table1 t union all select 'table2', t.* from table2 t 

Dies ist auch über alle databaseen hinweg kompatibel.