2011-01-07 8 views
1

Ich schaute auf die "Verwandte Fragen", wie ich begann, aber keiner von ihnen sind genau das gleiche wie das, was ich versuche zu tun.Beitreten oder Unterabfrage in MS Access

Wenn überhaupt möglich, möchte ich meine Abfrage aktualisierbar sein.

Was ist besser?

SELECT foobar.foo, foobar.bar 
FROM foobar 
WHERE foobar.baz IN (SELECT blahwoof.baz FROM blahwoof WHERE blahwoof.blah = 'value') 

Oder:

SELECT foobar.foo, foobar.bar 
FROM foobar INNER JOIN blahwoof ON foobar.baz = blahwoof.baz 
WHERE blahwoof.blah = 'value' 

bearbeiten

Ich habe voll die Spaltennamen oben qualifiziert. Ich erkannte auch, dass ich nicht vollständig angegeben hatte, dass es nur foobar ist, dass ich mich um Updates kümmere-- blahwoof ist nur eine Nachschlagetabelle.

Edit 2

Barebones Schema wie folgt (nicht tatsächliche Code, natürlich):

table foobar 
    foo  Autonumber PK 
    bar  long  FK ref gleeblesnort 
    baz  long  FK ref blahwoof 

table blahwoof 
    baz  Autonumber PK 
    blah  text  --'type' designation 

Ich werde schließlich auch Werte von gleeblesnort Strang ziehen, aber das ist nicht eine direkte Teil dieser Abfrage.

Antwort

0

Die erste Version der Ansicht wird in jedem einigermaßen kompatiblen SQL RDBMS aktualisierbar sein.

+0

Die JOIN-Version dieses speziellen Beispiels sollte ebenfalls aktualisierbar sein. Ihr Punkt, ich bin sicher, ist, dass die IN-Unterabfrage häufiger aktualisiert werden kann als die JOIN-Version, insbesondere wenn der Abfrageoptimierer nicht genau bestimmen kann, wie viele Datensätze von der JOIN-Anweisung zurückgegeben werden. –

+0

@David, um ehrlich zu sein, hatte ich ursprünglich einen zweiten Absatz, der erklärte, wie und warum diese Ansicht in Access updatefähig gemacht werden kann. Aber ich stellte fest, dass ich falsch lag (ich hatte irgendwie die Idee, dass es DISTINCTROW erforderte), also nahm ich es heraus und verließ den ersten Absatz. –

+0

DISTINCTROW kann einige SELECT-Anweisungen bearbeitbar machen, die ohne sie schreibgeschützt sind, aber es ist nicht einfach vorherzusagen, wann es funktioniert und wann nicht. Es hängt ausschließlich von der Ursache der Nichtbearbeitbarkeit ab. Wenn das Problem darin besteht, dass Jet nicht herausfinden kann, wie viele Zeilen sich auf jeder Seite des Joins befinden, kann DISTINCTROW es sehr oft bearbeitbar machen (wenn auch nicht immer).Wenn die Ursache der Nichtbearbeitbarkeit jedoch auf Domänenaggregaten oder GROUP BY in einem der JOINed SELECTs zurückzuführen ist, wird DISTINCTROW nicht wirksam. –

0

Verwenden Sie die innere Verbindung. Es sollte viel leistungsfähiger sein. IIRC, dies wird auch aktualisierbar sein.

+0

Die Antwort hängt von der SQL-Anweisung ab. Wenn die JOIN-Version aktualisierbar ist, wird sie wahrscheinlich schneller sein. Wenn dies nicht der Fall ist und Sie eine Aktualisierbarkeit benötigen, ist die IN-Unterabfrage die bessere Version. Aber das ist wirklich nur relevant für ein gebundenes Access-Formular (wo es sehr relevant ist) oder beim Gehen und Bearbeiten eines Recordsets. –

+0

Es wird auf einem gebundenen Formular sein, aber - wie ich in meinem Edit gesagt habe - es ist wirklich nur 'foobar.bar', das aktualisiert werden muss. – RolandTumble

+0

Ich denke, meine Antwort war ein wenig voreilig, da @David mich zum Nachdenken gebracht hat. Es wäre gut, etwas mehr über das Schema zu wissen - PKs, FKs, Unique Indexes ... der innere Join könnte die Foobar-Zeile mehr als einmal zurückgeben, wobei blahwoof.baz nicht eindeutig ist. – Brett

0

Ich denke, sie sind nicht die gleiche Abfrage. in der ersten Abfrage, wenn Sie 1 Baz-Wert haben, ist es genug, um die WHERE-Bedingung zu erfüllen, und Sie eigentlich für die Join-Ergebnisse (Baz und Blah = Wert ...)

gemeint (Sie müssen möglicherweise Tabellenpräfix infornt verwenden von baz, um es klarer zu machen)

+0

In jedem Tisch gibt es einen 'Baz' und mehrere Zeilen davon in' Blahwoof'. Es ist die einzige gemeinsame Spalte. Siehe Bearbeiten. – RolandTumble