2017-08-18 6 views
2

lassen Sie uns sagen, ich habe diese drei Tabellen:SAS: LEFT JOIN Werke für definierte Zahlen aber nicht für eine ausgewählte Liste von Zahlen

data Con1; 
input ID Age; 
cards; 
11 22 
23 32 
32 3 
14 73 
; 
run; 

data Con2; 
input ID Age; 
cards; 
11 22 
23 32 
32 3 
14 73 
15 11 
7 15 
; 
run; 

data Con3; 
input ID Height; 
cards; 
11 150 
23 180 
32 181 
14 175 
15 149 
7 159 
; 
run; 

Jetzt möchte ich nach links machen Verbindung zwischen Con2 und Con3 sondern nur für die Zeilen, die nicht in Con1 sind.

Das funktioniert gut, aber ich mag diese Tatsache nicht, dass ich zwei Schritte benötigt habe.

Also mein Ziel ist es nur ein Schritt zu bekommen, die irgendwie sollte wie folgt aussehen:

proc sql; 
create table want_fails as 
select 
a.*, 
b.Height 
from Con2 (where=(ID not in (select ID from Con1))) as a 
left join Con3 as b 
on a.ID=b.ID; 
run; 

Und ich verstehe einfach nicht, wie dies in einem Fehler behoben wird, wenn auf der anderen Seite des folgenden Aussage arbeitet gerade fein:

proc sql; 
create table want_works as 
select 
a.*, 
b.Height 
from Con2 (where=(ID not in (11 23 32 14))) as a 
left join Con3 as b 
on a.ID=b.ID; 
run; 

Hier ist der Fehler:

eRROR 22-322: Syntaxfehler, einer der erwartete folgende: eine Zeichenfolge in Anführungszeichen, ein numer ic Konstante, eine Datetime Konstante, ein fehlender Wert, -.
Fehler 76-322: Syntaxfehler, Anweisung wird ignoriert. FEHLER: Syntaxfehler beim Analysieren der WHERE-Klausel. FEHLER: Ungültiger Wert für die WHERE-Option. FEHLER: Einige Optionen für die Datei WORK.CON2 wurden aufgrund von oben genannten Fehlern oder Warnungen nicht verarbeitet.

Also können Sie mir bitte sagen, was ich übersehe?

Ich habe nur eine andere Workaround mit einem aber ich bevorzuge die Lösung von @ user2877959.

proc sql; 
create view test as 
select * 
from Con2 where ID not in (select ID from Con1); 
create table want_works2 as 
select 
a.*,b.Height from test as a 
left join Con3 as b 
on a.ID=b.ID; 
+0

Können Sie bitte eine Beispielausgabe liefern –

+0

Können Sie bitte die Fehlermeldung, die Sie erhalten, posten? – yaswanth

Antwort

2

Sie können keine Unterabfrage in einer where= Datensatzoption haben.

Funktioniert das nicht, was Sie wollen?

proc sql; 
    create table want_works as 
    select a.*, 
     b.Height 
    from Con2 as a 
    left join Con3 as b 
    on a.ID=b.ID 
    where a.ID not in (select ID from Con1); 
run; 
+0

Also gibt es einen Unterschied zwischen 'wo' und' wo = '? Ursache in der 'wo' Sie - und meine Abhilfe - haben auch eine Auswahl ... – Zap

+0

@Zap. . . Dein Kommentar macht keinen Sinn. Diese Abfrage hat die richtige SQL-Syntax für das, was Sie tun möchten. –

+1

Das 'where' in meiner Antwort ist eine SQL-Where-Klausel, in der Sie Unterabfragen haben können. Das 'where =' in Ihrem Beispiel, zwischen Klammern nach dem Tabellennamen, ist nicht SQL. Es ist eine SAS-Dataset-Option, wie 'keep =', 'drop =', 'rename =' usw. Diese unterstützen keine SQL-Abfragen als Argument. – user2877959

0

Sie können nicht die where= Dataset Option behandeln, als ob es SQL-Code war. Aber Sie könnten eine Unterabfrage verwenden, um dasselbe zu tun. Ihr ursprünglicher Code (formatiert für Lesbarkeit).

proc sql; 
create table want_fails as 
    select a.* 
     , b.Height 
    from Con2 (where=(ID not in (select ID from Con1))) as a 
    left join Con3 as b 
    on a.ID=b.ID 
; 
quit; 

Anstatt eine Dataset-Option zu verwenden, verwenden Sie einfach eine Unterabfrage als A-Alias.

proc sql; 
create table want_fails as 
    select a.* 
     , b.Height 
    from (select * from Con2 
     where ID not in (select ID from Con1) 
     ) as a 
    left join Con3 as b 
    on a.ID=b.ID 
; 
quit;