2011-01-07 15 views
1

私がこれを始めたときに "関連する質問"を見ましたが、それらのどれも私がしようとしているものとまったく同じものではありません。MS Accessに参加またはサブクエリ

可能な限り、私は自分のクエリを更新可能にしたい。

どちらが優れていますか?

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

または:

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

編集

私は完全に上記の列名を修飾しました。私は、foobarが私が更新を心配していることだけを完全には特定していないことに気づきました。blahwoofはルックアップテーブルです。

編集2

ベアボーンスキーマ(ない実際のコード、明らかに)次のように:

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

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

私は最終的にもgleeblesnortから値を引っ張っされますが、それは直接ではありませんこのクエリの一部

答えて

0

ビューの最初のバージョンは、合理的なSQL RDBMSで更新可能です。

+0

この特定の例のJOINバージョンも更新可能である必要があります。あなたのポイントは確かですが、INサブクエリはJOINバージョンよりも頻繁に更新可能です。特に、クエリオプティマイザがJOIN文によって返されるレコードの数を正確に判断できない場合は特にそうです。 –

+0

@David、正直言って、私はもともとAccessでこのビューを更新可能にする方法と理由を説明する第2段落を持っていました。しかし、私は間違っていることを発見しました(私は何とかDISTINCTROWが必要という考えを得ていました)ので、最初の段落を残しました。 –

+0

DISTINCTROWでは、一部のSELECT文を編集できないようにすることができますが、それがないと読み込み専用になることはありますが、いつ動作するのか、いつ動作しないのかは予測できません。これは、非編集可能性の原因に完全に依存します。基本的には、ジェットが結合の各側にある行の数を把握できない場合、DISTINCTROWは非常に頻繁に編集可能にすることができます(必ずしもそうとは限りません)。ただし、編集不可能な原因が、ジョインされたSELECTの1つにドメイン集計またはGROUP BYによるものである場合、DISTINCTROWは無効になります。 –

0

内部結合を使用します。それははるかに演奏しなければなりません。 IIRC、これも更新可能です。

+0

答えはSQL文によって異なります。 JOINバージョンが更新可能な場合は、より高速になる可能性があります。そうではなく、更新可能性が必要な場合は、INサブクエリがより良いバージョンです。しかし、それは本当にバインドされたAccessフォーム(それは非常に関連性が高い)またはレコードセットを歩いたり編集したりする場合にのみ関連します。 –

+0

これはバインドされたフォームになりますが、私が編集で言ったように、実際には 'foobar.bar'だけが更新可能である必要があります。 – RolandTumble

+0

@Davidが私に考えさせてくれたので、私の答えは少し面白かったと思います。 PK、FK、Unique Indexes ...スキーマについてもう少し知っておくとよいでしょう。内部結合は、foobar行を複数回返すことができます.blahwoof.bazは一意ではありません。 – Brett

0

私はそれらが同じクエリではないと思います。最初のクエリでは、baz値があればWHERE条件を満たすだけで十分です。実際には結合結果(bazとblah = value ...)を意味します。

(テーブル接頭辞infornt

+0

各テーブルに 'baz'があり、' blahwoof'にはいくつかの行があります。それは、共通の唯一の列です。編集を参照してください。 – RolandTumble