2012-01-20 7 views
5

Sto provando a farlo in Enterprise Guide, con un'attività, altrimenti userei solo un passaggio di dati.Come posso utilizzare Proc SQL per trovare tutti i record che esistono solo in una tabella ma non nell'altra?

In una fase dati, questo sarebbe:

data names; 
input name $; 
datalines; 
    John 
    Mary 
    Sally 
    Fred 
    Paul 
; 
run; 

data check; 
input name $; 
datalines; 
    Mary 
    Fred 
; 

Proc sort data=names; by name; run; 
Proc sort data=check; by name; run; 

Data work.not_in_check; 
merge names(in=n) check(in=c); 
by name; 
if n and not c; 
run; 

risposta

9

Ecco un modo. Ce ne sono sicuramente molti altri.

proc sql; 
create table not_in_check as 
select name 
from names 
where name not in (select name from check); 
quit; 
+1

Che è notevolmente più elegante rispetto al passaggio dei dati, se mi chiedi ... –

7

Un'altra leggera variazione è:

proc sql; 
create table not_in_check as select 
a.* from names as a left join 
      check as b on 
      a.name=b.name 
      where b.name is null; 
quit; 
+0

Questo è il metodo che ho finito per usare in EG. Nella sezione Dati filtro, ho usato b.name mancante. Sarebbe bello vedere una spiegazione sul perché, quando voglio che a.name non sia presente in b, b.name è nullo (mancante) ciò accade ... –

+1

È perché vengono lette 2 colonne, a. nome e b.name. Questi sono quindi abbinati e quindi se un nome esiste in a ma non b allora il record b.name mancherà. La sinistra si unisce alla clausola null dove clausola garantisce di mantenere solo i nomi in a ma non b. La selezione a. * Assicura che emetta solo i dati dalla tabella a, anche se sta leggendo i dati di entrambe le tabelle. Spero che questo ti aiuti. – Longfish

+0

buona spiegazione ... grazie –

0
proc sql; 
create table inNamesNotIncheck 
as 
select * 
from names n 
where not exists 
(select name 
from check c 
where n.name=c.name); 
quit; 
+0

Salve, il tuo post è stato contrassegnato come "di bassa qualità", probabilmente perché consiste solo di codice. Potresti migliorare in modo massiccio la tua risposta fornendo una spiegazione su come esattamente e perché questo risponde alla domanda? – Ben

+0

Apprezzo l'aggiunta del codice. Mostra un approccio diverso ma praticabile al problema già descritto. Grazie. –

1

Il seguente metodo è il modo piuttosto semplice per ottenere i record presenti in una tabella e non nell'altra.

tabella creata nuovo con i record che contengono Sesso = M, il risultato dopo l'interrogazione sarà record con il sesso = F.

Esempio:

data new; 
set sashelp.class; 
where sex = 'M'; 
run; 
proc sql; 
create table new1 as 
select * from sashelp.class 
except all 
select * from new; 
quit; 

metterà il codice per verificare il mio set di dati effettivi che sono di circa 100k obs e aggiornano il risultato.

P.S: so che la domanda è stata posta risposta e dimenticata, stavo cercando un modo per fare quanto sopra e non riuscivo a trovare una risposta diretta dove. Quindi, aggiungendo in modo che possa tornare utile. :)

Anche la mia prima risposta. :)

Problemi correlati