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.
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. –
@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. –
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. –