2016-08-08 8 views
0

以下は、私が数日間解決しようとしていたものの簡略化した例であり、以前質問した質問に関連していますが、この問題の問題の範囲を広げました。結合テーブルのSQL Server 2000の条件

この例では、問題は複数の連絡先を持つことができ、連絡先は複数の役割を持つことができます。

少なくとも1つの連絡先にRoleID = 4の役割がある場合にのみ結果を表示します。これは問題のすべての連絡先と役割を表示したいが、Issueに少なくとも1つの連絡先が必要であることを意味するRoleID = 4 。

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

それが重要ならば、これははい、私は、SQL Server 2000はもはやサポートされていることを使用するのは危険で無責任生き方過去終わり、など、などを知っていないと、SQL Server 2000上にあり、サーバーは今年の後半に別の部門のアップグレードが予定されており、その使用は今のところ私がコントロールできないものです。私は、少なくとも一つの接触が RoleID = 4と役割を持っている場合にのみ、これは私が 問題のために、すべての連絡先と役割を見たいと思っ意味するが、問題は、少なくとも一つの接触を持っている必要があり、結果を表示したい

答えて

0

where RoleID = 4

私はEXISTSを使用して問題のリストをフィルタリングします。

SELECT 
    i.ID, i.Date, c.Name, r.RoleID, r.RoleName 
FROM 
    Issue i 
INNER JOIN 
    Contact c ON c.IssueID = i.ID 
INNER JOIN 
    Role r ON r.ContactID = c.ID 
WHERE EXISTS (
    SELECT * 
    FROM Contact c1 ON c1.IssueID = i.ID 
    INNER JOIN 
    Role r1 ON r1.ContactID = c1.ID 
    AND r1.RoleID = 4 
) 

SQL 2000のことを判断していないのですが、降りる計画はありますか?あなたは追加の列が必要な場合は

SELECT i.ID 
FROM Issue i INNER JOIN 
    Contact c 
    ON c.IssueID = i.ID INNER JOIN 
    Role r 
    ON r.ContactID = c.ID 
GROUP BY i.ID 
HAVING SUM(CASE WHEN r.RoleId = 4 THEN 1 ELSE 0 END) > 0; 

:それは、無料のExpressエディションをダウンロードして、アップグレード時にやってみる、あるいは無料のクラウドソリューション

+0

あなたはたぶんそれを読まなかったかもしれませんが、それは今年の後半に他の部門のアップグレードが予定されています。 – Kershaw

+0

ああ、あなたは正しい - 私は自分のルールを壊し、正しく読まなかった! –

+0

ちょうど私のコードのいくつかのエラーに気づいた - それは今試してみる価値がある。 –

0

を試すために、今日はかなり簡単ですあなたは集約とhavingを使用して問題を得ることができます。、あなたは

+0

この種の作品は返されたすべてのレコードにRoleID = 4があります。その他のロールは結果に含まれておらず、Issueの他の連絡先にもRoleID = 4がありません。 – Kershaw

+0

@Kershaw。 。 。説明したように、これはあなたの状態に合った問題を返します。追加情報が必要な場合は、他のテーブルに戻って参加することができます。 –

+0

@Gordon ...私が意味するのは、RoleID = 4の場合にのみ役割を果たすということです。問題の少なくとも1つの連絡先にRoleID = 4があるすべての連絡先にすべての役割が必要です。 – Kershaw

0

別の解決策では、これらをバックに参加することができます はわずか2以上を追加= 4 RoleID持つ複数の連絡先がある場合、重複を削除するDISTINCT同じ連絡先/ロールテーブル+に結合します。

SELECT DISTINCT 
    i.ID, i.Date, c.Name, r.RoleID, r.RoleName 
FROM Issue i 
    INNER JOIN Contact c ON c.IssueID = i.ID 
    INNER JOIN Role r ON r.ContactID = c.ID 
    INNER JOIN Сontact c2 ON c2.IssueID = i.ID 
    INNER JOIN Role r2 ON r2.ContactID = c2.ID AND r2.RoleID = 4