2016-04-04 3 views
0

これはほとんど左結合状態ですが、sqlで表現する方法はわかりません。 フィールドUser, Item, FlagのテーブルOrdersを考えてみましょう。テーブルに表示されるが、Flag = Trueの行がないユーザーのリストが必要です。 (これらのフィールドにはNULLはありません)。同様に、ユーザーのすべての行でFlag = Falseで、そのような行があります。私は単純に書くでしょう条件を満たすsql不一致キー

SELECT T1.User FROM Orders AS T1 LEFT JOIN Orders AS T2 ON T1.User=T2.User WHERE T2.Flag=TRUE AND T2.User IS NULL を右に行を選択して、何の一致を得ていない参加をチェックするために、それは右

上の行に両方の基準を適用するよう、機能しません。もちろん、

私は試しました: SELECT T1.User FROM Orders AS T1 WHERE T1.User NOT IN (SELECT DISTINCT User FROM Orders WHERE Flag=TRUE) しかし、Microsoft Accessでは、これは極端にのように、最初の行ごとに2番目の選択が実行されているかのように遅いです。

これまでのところ、唯一の解決策は、2番目の選択から一時テーブルを作成することでした。しかし、それはとても簡単な問題です、それをSQLで表現する良い方法がなければなりません。 (これが明らかであれば謝罪しますが、私はまだSQLの複雑なセマンティクスを通して自分のやり方を感じています)

+0

最初のクエリで 'T1.User = NULL'を試してみてください。なぜ2番目のクエリでdistinctを使用するのですか? SQLの世界で頻繁に議論されている、[LEFT JOIN NULL、NOT IN、NOT EXISTS](http://www.google.com/search?q=left+join+vs+not+in)は不一致のために互換性がありますクエリを記録します。 – Parfait

答えて

0

サブクエリソリューションは健全で、索引付けの問題がない限り、なぜ低速であるのか想像できません。あなたの質問については、私は完全に理解しているかどうかはわかりませんが、フィルタ条件が両方のテーブルに適用されている問題がある場合は、WHERE句の代わりに条件をジョイン条件に追加してみてください。

SELECT T1.User 
FROM Orders AS T1 

LEFT JOIN Orders AS T2 
ON T1.User=T2.User 
AND T2.Flag = 'TRUE' 

WHERE T2.Flag=TRUE 
AND T2.User IS NULL 
関連する問題