2012-01-10 4 views
0

テーブル2に存在しないかステータスがnullのすべての値を取得するために2つのテーブルに対して左結合を実行しようとしています。複数の列でMicrosoft Access 97/XP左結合が失敗する - Vista/7が正常である

表1には長いROIDがあります。

表2には、ID long、Type long、およびStatus textがあります。

私はV.Type = 2を削除するとこれが(私はVには存在しないすべてのレコードを取得)Vistaと勝利7で正常に動作しますが、私はXPには、レコードを取得していない、

SELECT roid 
    FROM 
    wo AS w LEFT JOIN VFlag As V ON (w.roid = V.ID AND V.Type = 2) 
    WHERE 
    (V.Status is Null) 

、それはXP/Vistaの/ 7上で正常に動作しますが、私は、同様の種類に修飾する必要があります。

SELECT roid 
    FROM 
    wo AS w LEFT JOIN VFlag As V ON (w.roid = V.ID) 
    WHERE 
    (V.Status is Null) 

これは、両方のADOとVISDATAを使用してVB6です。 WHERE isnull(V.Status)は何の違いもありませんでした。 XPマシン(2台がテスト済み)はSP3です。

答えて

1

結合の代わりにWHERE句にV.Type = 2を配置しようとしましたか?

+0

、doesntの仕事に固定された症状を説明できます。そのテーブルに一致するIDがない可能性があります。 –

+0

ちょうど不思議なことに、XP上で実行しているときにV.Typeの値( "SELECT、roid、V.Type ...")をONから削除した後、その値を表示しようとしましたか? Vista/7で?すべてのO/Sのすべてのテーブルに同じデータが含まれていますか? –

+0

うん、私はいくつかのマシンにデータベースをコピーしました。前に言ったことを続けると、私はWHERE(V.TypeはNullまたはV.Type = 2)を実行することでそれを得ることができると思います。 Idはまだむしろ理由を見つけます。 –

0

まず、Accessの外部結合が標準に準拠していないため、予期しない結果が得られ、結果として表現力が低下します。known issueです。 The SQL Server team wanted to fix this 'bug' but was scuppered by the Windows Team;後でエンジンが固定される可能性は高くない。

第2に、SQLのNULLは一般的に災害です。 SQL標準では、3値論理を定義できません。特にアクセスは3値論理にも失敗し、多数の不一致があります。ヌル値を避けることが最善であり、外部結合はヌルを生成するように明示的に設計されています。

第3に、同じことをSQLで表現する以外にも、常に方法があります。必要な関係演算子はsemi difference a.k.a. antijoinです。あなたの仕様は「表2に存在しないすべての値を取得する」ので、NOT EXISTSを使用することを検討してください。

SELECT roid 
    FROM wo AS w 
WHERE NOT EXISTS (
        SELECT * 
        FROM VFlag As V 
        WHERE w.roid = V.ID 
          AND V.Type = 2 
       ); 

あなたの仕様で実装の詳細(LEFT OUTER JOIN)が含まれていると私は、木材のために木を見ることができないので、私は、サブクエリは、さらにテストV.Type IS NULLべきかどうかわからないんだけど:)

0

私はこれに少し遅れていますが、Access 2003で同じ問題が発生しているようです。 最新のJETでバグが修正されているようです。とてもよくあなたが見て、どのようにWindows 7で試してみました

MS KB275058

mikecro

関連する問題