2017-12-26 4 views
3

Ich möchte haben alle Tabellen in der Datenbank zu finden, die zwei Spalten LOCATION und ASSET_IDOracle alle Tabellen finden, die bestimmte Spalten

So habe ich versucht, dies:

select owner, table_name, column_name 
from all_tab_columns 
where column_name in ('LOCATION','ASSET_ID'); 

das Problem ist, diese Abfrage alle geben Tabellen, die LOCATION oder ASSET_ID nicht beide haben.

so habe ich es so aus:

select owner, table_name, column_name 
from all_tab_columns 
where 1=1 
and column_name ='LOCATION' 
and column_name = 'ASSET_ID'; 

es 0 Ergebnis zeigt.

Bitte helfen.

+1

Natürlich gibt dir der erste OR, und der zweite gibt dir keine Antworten - was hast du erwartet? – mathguy

Antwort

7

Wählen Sie alle Zeilen wie bei Ihrem ersten Versuch aus. Gruppieren Sie dann nach owner und table_name und behalten Sie nur diejenigen bei, die ZWEI Zeilen in der ursprünglichen Abfrage zurückgegeben haben. Verwenden Sie die having Klausel dafür:

select owner, table_name 
from  all_tab_columns 
where column_name in ('LOCATION','ASSET_ID') 
group by owner, table_name 
having count(*) = 2 
; 
0

Sie können dies ein paar Unterabfragen tun Verwendung als allgemeine Tabellenausdrücke einkalkuliert und eine Verknüpfung, wie in:

WITH cteLOCATION AS (SELECT OWNER, TABLE_NAME 
         FROM ALL_TAB_COLS 
         WHERE COLUMN_NAME = 'LOCATION'), 
    cteASSET_ID AS (SELECT OWNER, TABLE_NAME 
         FROM ALL_TAB_COLS 
         WHERE COLUMN_NAME = 'ASSET_ID') 
SELECT OWNER, TABLE_NAME 
    FROM cteLOCATION 
    NATURAL JOIN cteASSET_ID 

Dies ist einer der wenigen Situationen wo ich jemals NATURAL JOIN verwenden würde.

SQLFiddle here

Best of luck.

-1

dies versuchen,

SELECT * 
    FROM (SELECT a.*, 
       COUNT(1) OVER (PARTITION BY table_name) cnt 
      FROM all_tab_columns a 
     WHERE column_name IN ('LOCATION','ASSET_ID') 
     ORDER BY table_name) 
WHERE cnt = 2 
+0

sql hat eine 'habende'-Klausel, um eine solche Verschachtelung von selects zu vermeiden: https://stackoverflow.com/a/47981174/754550 – miracle173

+0

ja, ich stimme dir zu – eifla001

0

Joins (ähnlich @BobJarvis' https://stackoverflow.com/a/47984132/754550 aber traditionellere ohne mit - Klausel):

select a1.owner,a1.table_name 
from all_tab_columns a1, 
    all_tab_columns a2 
where a1.owner=a2.owner 
    and a1.table_name=a2.table_name 
    and a1.column_name='LOCATION' 
    and a2.column_name='ASSET_ID' 
order by a1.owner,a1.table_name 

oder unter Verwendung von Sätzen:

select owner, table_name 
    from all_tab_columns 
    where column_name='LOCATION' 
intersect 
    select owner, table_name 
    from all_tab_columns 
    where column_name='ASSET_ID' 
order by owner, table_name 

oder die 'group by' Klausel verwenden, wie bereits hier gepostet https://stackoverflow.com/a/47981174/754550 von @mathguy

select owner, table_name 
from all_tab_columns 
where column_name in ('LOCATION', 'ASSET_ID') 
group by owner, table_name 
having count(*)=2 
order by owner, table_name 
Verwandte Themen