Frage

. Situation: Ein PHP-Anwendung mit mehreren installierbaren Module erstellt eine neue Tabelle in der Datenbank für jeden, im Stil von mod_A, mod_B, mod_C usw. Jeder hat die Spalte SECTION_ID

Nun, ich bin auf der Suche für alle Einträge für einen bestimmten SECTION_ID, und ich hoffe, es gibt einen anderen Weg neben „Select * von mod_a, mod_b, mod_c ... mod_xyzzy wo SECTION_ID = Wert“ ... oder noch schlimmer, mit einer separaten Abfrage für jedes Modul.

War es hilfreich?

Lösung

Wenn die Tabellen im Laufe der Zeit ändern, können Sie Code gen Ihre Lösung in einem SP-inline (Pseudo-Code - Sie füllen müssen):

SET @sql = ''

DECLARE CURSOR FOR
SELECT t.[name] AS TABLE_NAME
FROM sys.tables t
WHERE t.[name] LIKE 'SOME_PATTERN_TO_IDENTIFY_THE_TABLES'

- oder das

DECLARE CURSOR FOR
SELECT t.[name] AS TABLE_NAME
FROM TABLE_OF_TABLES_TO_SEACRH t

START LOOP

IF @sql <> '' SET @sql = @sql + 'UNION ALL '
SET @sql = 'SELECT * FROM [' + @TABLE_NAME + '] WHERE section_id=value '

END LOOP

EXEC(@sql)

ich diese Technik gelegentlich verwendet habe, wenn es nur nicht klar, wie es zukunftssicher ohne dynamische SQL zu machen.

Hinweis: In der Schleife können Sie die COALESCE / NULL Ausbreitungs Trick verwenden und die Zeichenfolge als NULL vor der Schleife verlassen, aber es ist nicht so klar, wenn du mit dem Idiom nicht vertraut sind:

SET @sql = COALESCE(@sql + ' UNION ALL ', '')
    + 'SELECT * FROM [' + @TABLE_NAME + '] WHERE section_id=value '

Andere Tipps

Was?

SELECT * FROM mod_a WHERE section_id=value
UNION ALL
SELECT * FROM mod_b WHERE section_id=value
UNION ALL
SELECT * FROM mod_c WHERE section_id=value

Ich habe zwei Vorschläge.

  1. Vielleicht müssen Sie alle Ihre Tabellen konsolidieren. Wenn sie alle die gleiche Struktur enthalten, warum dann nicht eine „Master“ Modultabelle hat, fügt hinzu, dass nur eine neue Spalte identifiziert das Modul ( „A“, „B“, „C“, ....)

    Wenn Ihr Modultische sind meist die gleichen, aber Sie haben ein paar Spalten, die anders sind, können Sie noch in der Lage sein, alle die gemeinsame Informationen in einer Tabelle zu konsolidieren, und halten kleinere modulspezifische Tabellen mit diesen Unterschieden. Dann würden Sie müssen nur eine auf sie kommen zu tun.

    Dieser Vorschlag geht davon aus, dass Ihre Abfrage auf der Spalte SECTION_ID Sie erwähnen, ist superkritischen schnell nachzuschlagen. Mit einer Abfrage erhalten Sie alle allgemeinen Informationen, und mit einem zweiten würden Sie irgendeine spezifische Informationen erhalten, wenn man sie brauchte. (Und Sie könnten nicht - zum Beispiel, wenn Sie versuchen, die existense des Abschnitts zu bestätigen, dann ist es in dem gemeinsamen Tisch zu finden wären genug)

  2. Alternativ können Sie eine weitere Tabelle hinzufügen, die SECTION_ID die zu den Modulen zuordnet, die sie sind in.

    section_id | module
    -----------+-------
          1    |  A
          2    |  B
          3    |  A
         ...   | ...
    

    Das bedeutet aber, dass Sie zwei Abfragen auszuführen haben, eine gegen diese Zuordnungstabelle, und eine andere gegen die Modultabelle keine Nutzdaten zu ziehen.

    Sie können diese Tabelle auf diesen Spalten mit anderen Spalten und Indizes verlängern, wenn Sie andere Spalten müssen nachschlagen, die für alle Module gemeinsam sind.

    Dieses Verfahren hat die definitive disadvanage, dass die Daten dupliziert werden.

Vielleicht haben einige zusätzliche Informationen helfen würde, aber es klingt wie Sie die Lösung bereits haben. Sie werden von allen Tabellen mit einem SECTION_ID auswählen. Sie könnten schließt sich anstelle einer Tabellenliste verwenden, auf SECTION_ID Beitritt. Zum Beispiel

select a.some_field, b.some_field.... 
from mod_a a
inner join mod_b b on a.section_id = b.section_id
...
where a.section_id = <parameter>

Man könnte dies auch als eine Ansicht verpacken. Beachten Sie auch die Feldliste, anstatt *, die ich empfehlen würde, wenn Sie tatsächlich beabsichtigen, verwenden *.

Nun, es gibt nur so viele Möglichkeiten, um Informationen aus mehreren Tabellen zu aggregieren. Sie können beitreten, wie Sie in Ihrem Beispiel erwähnt, oder Sie können mehrere Abfragen und Vereinigung sie zusammen wie in borjab Antwort führen. Ich weiß nicht, ob einige Idee, einen Tisch zu schaffen, die alle Modul schneidet Tabellen für Sie nützlich sein würde, aber wenn SECTION_ID wie auf einem Tisch war, dass man alles von einer einzigen Abfrage zu bekommen wäre in der Lage. Ansonsten begrüße ich Ihre Faulheit, aber habe Angst zu sagen, ich sehe keinen Weg, diesen Job eaiser zu machen:)

Ich wollte das gleiche denken wie borjab vorzuschlagen. Das einzige Problem dabei ist, dass Sie alle diese Fragen haben zu aktualisieren, wenn Sie einen anderen Tisch. Die einzige andere Option, die ich sehe, ist eine gespeicherte Prozedur.

Ich glaube an eine andere Option hier, oder zumindest einen einfacheren Weg, dies zu präsentieren. Sie können auch einen Blick auf diese mehrere Tabellen verwenden, um sie als eine erscheinen zu lassen, und dann würde Ihre Abfrage aussehen sauberer, einfacher zu verstehen und Sie würden nicht eine lange Union-Abfrage neu zu schreiben, wenn Sie weitere Fragen zu diesen machen wollte mehrere Tabellen.

SELECT * FROM (
    SELECT * FROM table1
    UNION ALL
    SELECT * FROM table2
    UNION ALL
    SELECT * FROM table3
) subQry
WHERE field=value

Eine Option aus der Datenbank Seite wäre eine Ansicht der UNION alle verschiedenen Tabellen zu erstellen. Wenn Sie eine Tabelle hinzufügen, müßten Sie es zu der Ansicht hinzufügen, aber sonst wäre es wie eine einzige Tabelle suchen.

CREATE VIEW modules AS (
    SELECT * FROM mod_A
    UNION ALL 
    SELECT * FROM mod_B
    UNION ALL 
    SELECT * FROM mod_C
);

select * from modules where section_id=value;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top