none
Datenbank nach Spaltenname durchsuchen in allen Tabellen

    Frage

  • Hallo :)

    Ich habe folgendes Problem: Ich muss eine DB mit ca 250 Tabellen durchsuchen, und zwar nach einer Spalte. Ich habe keine Ahnung in welcher Tabelle sich diese Spalte befindet und müsste deshalb gleich die komplette DB durchsuchen. Ich bin jetzt schon seit geraumer Zeit am googeln, konnte aber keine Lösung für mich entdecken.

    Ich sag jetzt schonmal Danke! für eure Hilfe.

    Grüße, Simon

    ============================= EDIT =============================

    Ich bin nun doch endlich selber auf eine Lösung gekommen. Hier ist meine Lösung:

    SELECT TABLE_NAME, COLUMN_NAME
    FROM datenbank.INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME = 'Spalte, nach der gesucht wird'
    ORDER BY TABLE_NAME

    • Bearbeitet cH33zBurGer Donnerstag, 14. November 2013 09:43 Lösung gefunden
    Donnerstag, 14. November 2013 08:25

Antworten

  • invalid identifier"

    Wenn Du eine Unterabfrage verwendest, muss Du ein Alias angeben, sonst gibt es so eine Fehlermeldung

    select table_name 
    from (select table_name from dba_tab_columns where COLUMN_NAME = 'Tabelle A') AS myAlias
    where COLUMN_NAME = 'Tabelle B';

    Wenn Du Tabellen finden willst, die beide Felder enhält, musst Du die Anzahl der gefundenen zählen und darauf filtern, das geht einer Gruppierung und der HAVING Klausel; in diesem Beispiel für 3 gesuchte Fehler.

    select table_name 
    from dba_tab_columns 
    where COLUMN_NAME IN ('gesuchte Spalte ein', 'gesuchte Spalte zwei', 'gesuchte Spalte zwei')
    GROUP BY table_name
    HAVING COUNT(*) = 3


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 19. Oktober 2017 06:37
  • Ja, bei Oracle ist das mit dem Alias so eine Sache, an machen Stelle ist das Schlüsselwort "AS" zulässig, an anderen nicht; lass es einfach mal weg

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 19. Oktober 2017 09:57
  • Hi,

    Oracle ist nicht Access oder SQL Server. Die SQL Syntax unterscheidet sich teils schon erheblich.

    Probier es mal so:

    SELECT   table_name
    FROM     dba_tab_columns
    WHERE    COLUMN_NAME IN ('Spalte Eins', 'Spalte Zwei')
    AND      LENGTH ( table_name ) <= 3
    GROUP BY table_name
    HAVING   count(*) = 2
    

    Ansonsten am besten in einem Forum fragen, dass sich mit Oracle und dessen SQL Statements befasst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 19. Oktober 2017 08:58
    Moderator

Alle Antworten

  • Jemand eine Idee was man ändern müsste wenn man nach mehreren WHERE-Bedingungen suchen möchte? 

    z.B. eine Tabelle die zwei bestimmte Spalten hat?

    Das war meine Idee, leider ohne erfolg.

    select table_name 
    from dba_tab_columns 
    where COLUMN_NAME = 'gesuchte Spalte ein' and COLUMN_NAME = 'gesuchte Spalte zwei';

    Gruß


    • Bearbeitet PumpEE Mittwoch, 18. Oktober 2017 11:53
    Mittwoch, 18. Oktober 2017 11:51
  • AND Logik geht natürlich nicht, eine Spalte kann nicht gleichzeitig zwei verschiedene Namen haben.

    Entweder mit OR verknüpfen oder den IN Operator verwenden

    select table_name 
    from dba_tab_columns 
    where COLUMN_NAME IN ('gesuchte Spalte ein', 'gesuchte Spalte zwei', 'gesuchte Spalte zwei')


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 18. Oktober 2017 13:55
  • Danke für die Antwort und natürlich haben Sie Recht.

    Allerdings bekomme ich immer noch nicht das gewünschte Ergebnis. Ich beschreibe mal mein Anliegen:

    Ich suche Tabellen die beiden Spalten haben A und B. Wenn ich den IN Operator benutze bekomme ich zu viele Treffer, es werden mir auch Tabellen angezeigt die entweder oder haben und natürlich auch die die beide haben.

    Würde eine Unterabfrage gehen? z.B:

    select table_name 
    from (select table_name from dba_tab_columns where COLUMN_NAME = 'Tabelle A')
    where COLUMN_NAME = 'Tabelle B';

    Leider funktioniert das nicht bei mir, Fehlermeldung ist:

    ORA-00904: "COLUMN_NAME": ungültiger Bezeichner
    00904. 00000 -  "%s: invalid identifier"
    *Cause:    
    *Action:
    Fehler in Zeile: 15 Spalte: 9

    Haben Sie eine Idee?

    Mittwoch, 18. Oktober 2017 14:46
  • invalid identifier"

    Wenn Du eine Unterabfrage verwendest, muss Du ein Alias angeben, sonst gibt es so eine Fehlermeldung

    select table_name 
    from (select table_name from dba_tab_columns where COLUMN_NAME = 'Tabelle A') AS myAlias
    where COLUMN_NAME = 'Tabelle B';

    Wenn Du Tabellen finden willst, die beide Felder enhält, musst Du die Anzahl der gefundenen zählen und darauf filtern, das geht einer Gruppierung und der HAVING Klausel; in diesem Beispiel für 3 gesuchte Fehler.

    select table_name 
    from dba_tab_columns 
    where COLUMN_NAME IN ('gesuchte Spalte ein', 'gesuchte Spalte zwei', 'gesuchte Spalte zwei')
    GROUP BY table_name
    HAVING COUNT(*) = 3


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 19. Oktober 2017 06:37
  • Danke auf hier für.

    Mit GROUP BY und HAVING hat das super funktioniert. Jetzt würde ich gerne das Ergebnis noch weiter filtern wollen und zwar durch eine Unterabfrage.

    select table_name
    from (select table_name
          from dba_tab_columns
          where COLUMN_NAME IN ('Spalte Eins', 'Spalte Zwei')
          group by table_name
          HAVING count (*) = 2) AS myAlias
    where LENGTH (table_name) <= 3 ;

    Hier habe ich, wie oben schon gezeigt, ein Alias gesetzt, aber Ich bekomme hier folgenden Fehler:

    ORA-00933: SQL-Befehl wurde nicht korrekt beendet
    00933. 00000 -  "SQL command not properly ended"
    *Cause:    
    *Action:
    Fehler in Zeile: 17 Spalte: 5

    (Das Alias wird "rot" Unterstrichen)

    Leider habe ich keine Idee was ich hier ändern könnte.   




    • Bearbeitet PumpEE Donnerstag, 19. Oktober 2017 08:48
    Donnerstag, 19. Oktober 2017 08:41
  • Hi,

    Oracle ist nicht Access oder SQL Server. Die SQL Syntax unterscheidet sich teils schon erheblich.

    Probier es mal so:

    SELECT   table_name
    FROM     dba_tab_columns
    WHERE    COLUMN_NAME IN ('Spalte Eins', 'Spalte Zwei')
    AND      LENGTH ( table_name ) <= 3
    GROUP BY table_name
    HAVING   count(*) = 2
    

    Ansonsten am besten in einem Forum fragen, dass sich mit Oracle und dessen SQL Statements befasst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 19. Oktober 2017 08:58
    Moderator
  • Hallo,

    danke für die Antwort, leider hat das nicht funktioniert.

    Ich werde mal nach einem Oracle Forum suchen.

    Donnerstag, 19. Oktober 2017 09:04
  • Ja, bei Oracle ist das mit dem Alias so eine Sache, an machen Stelle ist das Schlüsselwort "AS" zulässig, an anderen nicht; lass es einfach mal weg

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 19. Oktober 2017 09:57
  • Perfekt! Es hat geklappt. Vielen dank. 
    Donnerstag, 19. Oktober 2017 10:45