2012-03-09 4 views
2

私はC#アプリケーションを作成していますが、Access.mdbを使用しています。私は電子メールメッセージとメッセージの関係を持つテーブルを持ったテーブルを持っています(各Eメールメッセージは複数のチームの作業者に割り当てられます)。SQL:別のテーブルにリレーションを持たないデータを選択してください

どのチームにも割り当てられていない、つまり2番目のテーブルにエントリがないか、または空のエントリがあるメッセージを最初のテーブルから取得したいとします。空のエントリでは正常に動作しますが、その割り当てエントリがまったくない行は返されません。

私は次のクエリを使用しています:

SELECT TOP 10 Mails.* 
FROM Mails INNER JOIN MailAssignments ON Mails.msgId = MailAssignments.msgId 
    WHERE (Mails.msgId <= ?) 
    AND 
    (Mails.msgId NOT IN (SELECT msgId FROM MailAssignments)) 
    OR (MailAssignments.forTeam IS NULL) 
    OR (MailAssignments.forTeam = '') 

UPDATE:

をいくつかの条件にクエリはまた、中に関係を持つ行を返す必要がありますので、私は、JOINのいくつかの種類を使用する必要があります他のテーブル(例えば、誰かが自分のチームからのメッセージと割り当てられていないメッセージを表示したいとき)。

はUPDATE:

OK、私は私が空に割り当て、存在しないものだけをチェックする必要がないように、私は2番目のテーブルからすべての割り当てを削除することによってsimplierそれを作ることができますねまったく。しかし、私はまだ割り当てられていないデータと一緒に割り当てられたデータを表示する必要があります。そして、私は唯一の異なるパラメータを持つことになり、そのための1つのクエリを構築する必要が変更されました:/

UPDATE/SOLUTION:

を私はいくつかのより多くの調整が左サイドは基本的に私のためにトリックがしたJOINをやりました!そのヒントとあなたのすべての助けをありがとう、みんな!

+0

更新:あなたは本当にメールのチームからのメッセージを持つことはできませんがチームに割り当てられていないものはありますか? –

+0

私は労働者にデフォルトでチームのメッセージを見せてもらいたいが、他のビューを有効にすると割り当てられていないメッセージも表示されるはずです(したがってチームに割り当てます) – Val

+0

さらに調整しましたが、LEFT JOINは基本的に私のためのトリック!助けてくれてありがとう、みんな! – Val

答えて

4

これは十分にする必要があります:あなたはMailsに関連しているが、チームは本当に割り当てられていないことをMailAssignments内の行を有することができるTHA

SELECT TOP 10 Mails.* 
FROM Mails 
    WHERE (Mails.msgId <= ?) 
    AND 
    (Mails.msgId NOT IN (SELECT msgId FROM MailAssignments)) 

はあなたの説明を読んで、それはそう(forTeam列が持っています空文字列これは良いデザインではありませんが、この場合は次のようにしてください:

SELECT TOP 10 Mails.* 
FROM Mails 
    LEFT JOIN 
    MailAssignments ON Mails.msgId = MailAssignments.msgId 
WHERE (Mails.msgId <= ?) 
    AND ( (MailAssignments.forTeam IS NULL) 
     OR (MailAssignments.forTeam = '') 
    ) 
+0

Accessが一致を返すため、10を超えるレコードが返される可能性があるという警告が表示されます。これを回避するには、Order Byステートメントに一意の列(フィールド)を含める必要があります。 – Fionnuala

+0

それは私にとっては問題ありません。最も重要なのは、他の条件が正しく動作することです(JOINキーワードを含む) – Val

1

2番目の表の列が必要なので、 INNER JOINの代わりにOUTER JOINを使用します(結合の一致がないテーブルのエントリを返します)。

必要がない場合は、@ypercubeに同意します。

2

既存の割り当て(forTeam <> '')とのメールに一致するようにしようと何の試合が行われなかった場所ピッキング・MailAssignmentsのサブセットにMailsに参加:

SELECT TOP 10 
    Mails.* 
FROM Mails 
    LEFT JOIN MailAssignments ON Mails.msgId = MailAssignments.msgId 
    AND MailAssignments.forTeam <> '' 
WHERE Mails.msgId <= ? 
    AND MailAssignments.msgId IS NULL /* either no match for this mail at all 
             or no match with an existing assignment 
             – so, just no match */ 
+0

'MailAssignments.forTeam <> '''はこのように取り消されますか? –

+0

@ypercube:はい、クエリは、 'Mails'行に' MailAssignments'マッチがまったくない行を返すことになっています。あるいは、マッチに空の 'forTeam'値があります(' '' 'または' NULL' )。 –

+0

@ypercube:実際に返されるものを指定するのを忘れていました。 :)答えを更新しました。 –

関連する問題