sql >> Database teknologi >  >> RDS >> Oracle

Søg i alle felter i alle tabeller for en bestemt værdi (Oracle)

Citat:

Jeg har forsøgt at bruge denne erklæring nedenfor for at finde en passende kolonne baseret på, hvad jeg synes, den skal hedde, men den gav ingen resultater.*

SELECT * from dba_objects WHERE
object_name like '%DTN%'

En kolonne er ikke et objekt. Hvis du mener, at du forventer, at kolonnenavnet er som '%DTN%', er den forespørgsel, du ønsker:

SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';

Men hvis 'DTN'-strengen kun er et gæt fra din side, hjælper det sandsynligvis ikke.

Hvor sikker er du i øvrigt på, at '1/22/2008P09RR8' er en værdi valgt direkte fra en enkelt kolonne? Hvis du slet ikke ved, hvor det kommer fra, kan det være en sammenkædning af flere kolonner, eller resultatet af en funktion eller en værdi, der sidder i et indlejret tabelobjekt. Så du er måske på en vild jagt og prøver at tjekke hver kolonne for den værdi. Kan du ikke starte med hvilket klientprogram, der viser denne værdi, og prøve at finde ud af, hvilken forespørgsel den bruger for at få den?

Anyway, dicius svar giver én metode til at generere SQL-forespørgsler for at kontrollere hver kolonne i hver tabel for værdien. Du kan også lave lignende ting helt i én SQL-session ved hjælp af en PL/SQL-blok og dynamisk SQL. Her er noget hastigt skrevet kode til det:

    SET SERVEROUTPUT ON SIZE 100000

    DECLARE
      match_count INTEGER;
    BEGIN
      FOR t IN (SELECT owner, table_name, column_name
                  FROM all_tab_columns
                  WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP

        EXECUTE IMMEDIATE
          'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
          ' WHERE '||t.column_name||' = :1'
          INTO match_count
          USING '1/22/2008P09RR8';

        IF match_count > 0 THEN
          dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
        END IF;

      END LOOP;

    END;
    /

Der er nogle måder, du også kan gøre det mere effektivt på.

I dette tilfælde, givet den værdi, du leder efter, kan du klart eliminere enhver kolonne, der er af typen NUMBER eller DATE, hvilket ville reducere antallet af forespørgsler. Måske endda begrænse det til kolonner, hvor typen er som '%CHAR%'.

I stedet for én forespørgsel pr. kolonne kan du bygge én forespørgsel pr. tabel som denne:

SELECT * FROM table1
  WHERE column1 = 'value'
     OR column2 = 'value'
     OR column3 = 'value'
     ...
     ;


  1. Oracle - Sådan genereres script fra sql-udvikler

  2. SQL Server ALL Operator forklaret

  3. MySQL dynamisk pivottabel

  4. MySQL vælg sætning med CASE eller IF ELSEIF? Ikke sikker på, hvordan man får resultatet