without - sql server table alias




SQL-Tabellenaliasbereich (4)

Es ist spezifisch für jedes DBMS und hängt vom Abfrageoptimierer ab. Einige Optimierer erkennen die IN-Klausel und übersetzen sie.

In allen DBMSes, die ich getestet habe, ist Alias ​​nur innerhalb der ()

Übrigens können Sie die Abfrage wie folgt umschreiben:

select t.* 
from table t 
join othertable o on t.nameid = o.nameid 
    and o.otherdesc in ('SomeDesc','SomeOtherDesc');

Und um deine Fragen zu beantworten:

  1. Ja
  2. Ja
  3. Ja

Ich habe gerade (gestern) gelernt, "existiert" anstelle von "in" zu verwenden.

 BAD
 select * from table where nameid in ( 
          select nameid from othertable where otherdesc =  'SomeDesc' )      
 GOOD
 select * from table t where exists ( 
          select nameid from othertable o where t.nameid = o.nameid and otherdesc =  'SomeDesc' )      

Und ich habe ein paar Fragen dazu:

1) Die Erklärung, wie ich es verstanden habe, war: "Der Grund, warum dies besser ist, ist, weil nur die übereinstimmenden Werte zurückgegeben werden, anstatt eine massive Liste von möglichen Ergebnissen zu erstellen" . Bedeutet das, dass, während die erste Unterabfrage 900 Ergebnisse zurückgibt, die zweite nur 1 (ja oder nein) zurückgibt?

2) In der Vergangenheit hatte ich das RDBMS beschweren: "Nur die ersten 1000 Zeilen könnten abgerufen werden", dieser zweite Ansatz würde dieses Problem lösen?

3) Was ist der Umfang des Alias ​​in der zweiten Unterabfrage? ... lebt der Alias ​​nur in der Klammer?

beispielsweise

 select * from table t where exists ( 
          select nameid from othertable o where t.nameid = o.nameid and otherdesc =  'SomeDesc' )      
 AND 
          select nameid from othertable o where t.nameid = o.nameid and otherdesc =  'SomeOtherDesc' )      

Das heißt, wenn ich den gleichen Alias ​​verwende (o für die Tabelle oothertable). In der zweiten "exist" wird es irgendein Problem mit dem ersten existieren? oder sind sie völlig unabhängig?

Ist das etwas, was Oracle nur betrifft oder ist es für die meisten RDBMS gültig?

Danke vielmals


Persönlich würde ich einen Join statt einer Unterabfrage dafür verwenden.

SELECT t.*
FROM yourTable t
    INNER JOIN otherTable ot
        ON (t.nameid = ot.nameid AND ot.otherdesc = 'SomeDesc')

Es ist schwierig zu verallgemeinern, dass EXISTS immer besser ist als IN. Logisch, wenn das der Fall ist, dann hätte die SQL-Gemeinschaft IN durch EXISTS ersetzt ... Beachten Sie auch, dass IN und EXISTS nicht identisch sind, die Ergebnisse können unterschiedlich sein, wenn Sie die beiden ...

Mit IN, normalerweise ist es eine vollständige Tabelle Scan der inneren Tabelle einmal ohne NULL entfernen (wenn Sie also NULL in der inneren Tabelle haben, wird IN standardmäßig nicht NULL entfernen) ... Während EXISTS entfernt NULL und im Falle korrelierter Unterabfrage, Es wird eine innere Abfrage für jede Zeile aus der äußeren Abfrage ausgeführt.

Angenommen, es gibt keine NULLS und es ist eine einfache Abfrage (ohne Korrelation), könnte EXIST besser funktionieren, wenn die Zeile, die Sie finden, nicht die letzte Zeile ist. Wenn es sich um die letzte Zeile handelt, müssen EXISTS möglicherweise bis zum Ende wie IN ... scannen.

Aber IN und EXISTS sind nicht austauschbar ...


  1. Oracle-spezifisch: Wenn Sie eine Abfrage mit der IN-Klausel schreiben, teilen Sie dem regelbasierten Optimierer mit, dass die innere Abfrage die äußere Abfrage steuern soll. Wenn Sie EXISTS in eine WHERE-Klausel schreiben, teilen Sie dem Optimierer mit, dass die äußere Abfrage zuerst ausgeführt werden soll. Verwenden Sie dazu jeden Wert, um einen Wert aus der inneren Abfrage abzurufen. Siehe "Unterschied zwischen IN und EXISTS in Unterabfragen" .
  2. Wahrscheinlich.
  3. Alias, das innerhalb der Unterabfrage deklariert wird, lebt in der Unterabfrage. Übrigens, ich glaube nicht, dass Ihr Beispiel mit 2 UND-Unterabfragen ein gültiges SQL ist. Meinst du UNION statt AND?




table-alias