2016-08-08 8 views
0

複数のテーブルを結合しています。私の結合(1対多)の場合、結合された表に特定の値が存在する行が少なくとも1つある場合にのみ結果を表示したい。SQL Server 2000がカウント条件付きで結合する

この例は、他の結合は除外するので、簡単のために:

SELECT 
    c.Name, r.RoleID, r.RoleName 
FROM 
    Contact c 
INNER JOIN 
    Role r ON r.ContactID = c.ID 

問い合わせは、多くの役割を持つことができます。連絡先のすべての役割を表示したいが、少なくとも1つの役割にRoleID = 4がある連絡先のみを取得する。あなたはEXISTSを使用することができますSQL Server 2000 condition on joined table

+1

Sql Server 2000は、人生の終わりを迎えています。これは、それがもはや更新を取得しないことを意味します...重要なセキュリティパッチではありません!_それを使用し続けることは危険で無責任です。このサーバーのアップグレードは、ジョブ#1です。 –

+0

私はあなたにもっと同意できませんでした。そのサーバーは、今年の後半に別の部門によるアップグレードが予定されています。 – Kershaw

+0

私は問題をこの新しい質問に拡大しました:http://stackoverflow.com/questions/38839917/sql-server-2000-condition-on-joined-table – Kershaw

答えて

1

ID 4をフィルタとして制限した後、もう一度すべての役割を取得するように2回参加します。

SELECT 
    c.Name, r.RoleID, r.RoleName 
FROM 
    Contact c 
INNER JOIN --if a Contact does not match any Roles with ID 4, this join will exclude that contact from the results 
    Role rt /*role temp*/ ON rt.ContactID = c.ID AND rt.RoleId = 4   
INNER JOIN 
    Role r ON r.ContactID = c.ID 

これは、質問に明示的に記載されていないことを前提にしています。連絡先には多くの役割がありますが、連絡先には同じ役割が複数割り当てられていないことが前提です。

+0

ロール・レコードには、特定の連絡先の同じ役割を区別する他のプロパティがあるので、実際には連絡先には複数の役割がある場合があります。 – Kershaw

+0

その場合、サーバーのアップグレードを待つことが最善の方法です.Sql Serverの新しいバージョンでは、APPLY演算子を使用して1つ目のJOINを作成することができます。これを使用して1つの結果に限定することができます。 –

+0

これは現時点では実際には選択肢ではありません。私はタスクを支援するためにこのクエリを使用していますが、そのタスクはすでに期限が切れています!あなたの入力のThx、それは私に解決策につながる可能性があります。 – Kershaw

0

SELECT 
    c.Name, r.RoleID, r.RoleName 
FROM 
    Contact c 
INNER JOIN 
    Role r ON r.ContactID = c.ID 
WHERE EXISTS(SELECT 1 FROM Role 
      WHERE RoleID = 4 
      AND ContactID = c.ID); 
+0

あなたの解決策は動作しますが、参加する他のテーブル私は、すべての連絡先にroleID = 4が返されるわけではありませんが、いくつかの問題が発生しています。あなたは質問された質問に対する実践的な答えを提供しているので、それに対する信用を得なければなりません。 – Kershaw

0

あなたが

を試していることが重要ならば、これは私がこの新しい問題に問題の範囲を拡大しているSQL Server上で2000

です

SELECT 
    c.Name, r.RoleID, r.RoleName 
FROM 
    Contact c 
INNER JOIN 
    Role r ON r.ContactID = c.ID group by c.Name, r.RoleID, r.RoleName having min(r.RoleID) = 4 
+0

この回答はRoleID = 4のロールのみを返し、他のロールは返しません。あなたは 接点C INNER FROM c.Name、r.RoleID、r.RoleName を選択することを のように使用することができます – Kershaw

+0

c.IDでは( Rを選択r.ContactID = c.ID ON 役割rを登録しよう。 ContactID FROM ロールrグループ(r.RoleID)= 4)を持つr.ContactID –

+0

RoleIDは1から始まり、ContactはRoleIDが1、3、4、22などとなる可能性があります「分(r.RoleID)= 4)」はRoleID <4の連絡先を省略しますか? – Kershaw