2012-11-07 21 views
5

Sto lavorando a un progetto e ho un elenco di diverse migliaia di record che ho bisogno di controllare. Devo fornire l'elenco di quelli NON trovati e fornire la query che utilizzo per localizzarli in modo che i miei superiori possano controllare il loro lavoro.Restituzione di valori non trovati nella query

Ammetto che sono relativamente nuovo a SQL. Non ho accesso per creare tabelle temporanee, il che è un modo in cui avevo pensato di farlo.

Un'idea di base di quello che sto facendo:

select t.column1, t.column2 
from table1 t 
where t.column1 in ('value1','value2','value3') 

Se valore1 e value3 sono nel database, ma non è value2, ho bisogno di visualizzare valore2 e non gli altri.

Ho provato ISNULL, incorporando la query e tentando di selezionare i valori NOT dalla query.

Ho cercato record di ritorno non trovati in una query su Google e su questo sito, e ancora non ho trovato nulla.

+0

Cosa è possibile creare sul server tabelle complete, visualizzazioni, procedura di archiviazione, ..? che tipo di sql è? – Jester

+0

"seleziona t.column1, t.column2 da table1 t dove t.column1 NOT in ('value1', 'value2', 'value3')" funziona per te? Se hai solo migliaia di elementi, puoi inserirli in un elenco simile. –

risposta

0

soluzione potrebbe funzionare in Oracle in cui dual è singola tabella di colonna singola riga. Hai bisogno di una tabella in cui puoi fare una selezione virtuale dei valori desiderati!

AVVISO poiché non ho accesso a DB non ho mai testato la query di seguito.

SELECT tab_all.col_search, t.column1, t.column2 
FROM 
(
    Select value1 AS col_search from dual 
    union all 
    Select value2 from dual 
    union all 
    Select value3 from dual 
) tab_all left join table1 t 
on col_search = t.column1 
WHERE t.column1 is null; 

I belive SQLServer equivalente di SELEZIONA valore1 di Oracle DA duale è SELEZIONA valore1 o SELECT 'value1'.

in modo da provare

SELECT tab_all.col_search, t.column1, t.column2 
FROM 
(
    Select value1 AS col_search 
    union all 
    Select value2 AS col_search 
    union all 
    Select value3 AS col_search 
) tab_all left join table1 t 
on col_search = t.column1 
WHERE t.column1 is null; 

Come io non sono SQLServer persona potrebbe essere che la versione RichardTheKiwi di Oracle di selezionare dalla doppia è meglio.

+0

Abbastanza corretto, è SQL Server 2008 R2. Avrei dovuto specificare che siamo limitati a T-SQL. Sono abbastanza limitato a selezionare solo, aggiornamenti, inserimenti ed eliminazioni, non posso accedere alle stored procedure (anche se ho trovato il modo di aggirarle), non posso creare viste o tabelle. –

2

ho provato qualcosa di simile:

Innanzitutto creare una tabella che conterrà tutti questi valori che avete bisogno.

Diciamo

create table table_values(values varchar2(30)); 

quindi provare il nella clausola, come di seguito:

select * from table_values tv where tv.value not in (select t.column1 
from table1 t); 

Ciò restituirà i valori necessari.

+0

Nel primo post non ha menzionato i tavoli TMP! – elrado

1

In SQL Server 2008, è possibile creare tabelle derivate utilizzando la sintassi VALUES(...)(...)(...), ad es.

select v.value 
     from (
      values ('value1'),('value2'),('value3') 
      ) v(value) 
left join table1 t on t.column1 = v.value 
    where t1.column1 is null 

Note:

  1. Ogni (...) dopo valori è una singola riga, e si può avere più colonne.
  2. Il v(value) dopo la tabella derivata è l'alias dato alla tabella e il nome della colonna (s).
  3. LEFT JOIN mantiene i valori della tabella derivata v anche quando il record non esiste nel table1
  4. Poi, teniamo solo i record che non possono essere associati, vale a dire t1.column1 is null
  5. ho passato la prima colonna nella selezione per la colonna da v. column2 viene rimosso perché è sempre nullo
Problemi correlati