2

SQLクエリに問題があります。以下のクエリは、権利の結果を返します。これは、男性でスウェーデン語を話し、グループ 4 に属するテーブル内のメンバーを返します。

SELECT DISTINCT Member.ID 
FROM Member
LEFT OUTER JOIN Experience ON Experience.MemberID = Member.ID
LEFT OUTER JOIN Qualification ON Qualification.MemberID = Member.ID
LEFT OUTER JOIN Language On Language.MemberID = Member.ID
LEFT OUTER JOIN Member_Interests ON Member_Interests.MemberID = Member.ID
LEFT OUTER JOIN Group_Members ON Group_Members.MemberID = Member.ID
WHERE 1=1 AND Gender = 'male' AND Language.Name IN ( 'Swedish' ) AND Group_Members.GroupID = 4 

ただし、me​​mbers テーブルを直接検索する他の where 基準を除外すると、language.Name は単純に無視されます。すなわち。

SELECT DISTINCT Member.ID 
FROM Member
LEFT OUTER JOIN Experience ON Experience.MemberID = Member.ID
LEFT OUTER JOIN Qualification ON Qualification.MemberID = Member.ID
LEFT OUTER JOIN Language On Language.MemberID = Member.ID
LEFT OUTER JOIN Member_Interests ON Member_Interests.MemberID = Member.ID
LEFT OUTER JOIN Group_Members ON Group_Members.MemberID = Member.ID
WHERE 1=1 AND Language.Name IN ( 'Swedish' ) AND Group_Members.GroupID = 4

上記のクエリは、グループ 4 にあるすべてのメンバーを返します。スウェーデン語の部分は単純に無視され、言語テーブルにスウェーデン語という言語がある限り、すべてのユーザーが返されます。言語が表にない場合、ユーザーは返されません。

2 番目のクエリで、スウェーデン語を話すグループ 4 のすべてのメンバーを返すようにしたいと思います。なぜこれが起こっていないのか誰にも分かりますか?

4

4 に答える 4

0

左の結合テーブルのフィルターを結合に移動します。

例えば:

LEFT OUTER JOIN Language On Language.MemberID = Member.ID 
     and LanguageID in ('Swedish')
LEFT OUTER JOIN Group_Members ON Group_Members.MemberID = Member.ID 
     AND Group_Members.GroupID = 4 
...
WHERE 1=1 AND Gender = 'male' 

于 2012-08-17T14:46:46.583 に答える
0

内部結合で試しましたか?

あるいは単に

SELECT DISTINCT Member.ID 
FROM Member, Language
LEFT OUTER JOIN Experience ON Experience.MemberID = Member.ID
LEFT OUTER JOIN Qualification ON Qualification.MemberID = Member.ID
LEFT OUTER JOIN Member_Interests ON Member_Interests.MemberID = Member.ID
LEFT OUTER JOIN Group_Members ON Group_Members.MemberID = Member.ID
WHERE 1=1 AND Gender = 'male' AND Language.MemberID = Member.ID AND Language.Name IN ( 'Swedish' ) AND Group_Members.GroupID = 4 
于 2012-08-17T14:58:43.693 に答える
0

以前のクエリで正しい結果が得られた場合。次に、これは必要に応じて機能する必要があります

SELECT DISTINCT Member.ID 
FROM Member
LEFT OUTER JOIN Experience ON Experience.MemberID = Member.ID
LEFT OUTER JOIN Qualification ON Qualification.MemberID = Member.ID
LEFT OUTER JOIN Language On Language.MemberID = Member.ID
LEFT OUTER JOIN Member_Interests ON Member_Interests.MemberID = Member.ID
LEFT OUTER JOIN Group_Members ON Group_Members.MemberID = Member.ID
WHERE 1=1 AND Gender IN ('male','female') AND Language.Name IN ( 'Swedish' ) 
AND Group_Members.GroupID = 4;

問題があれば試してみてください。コメントしてください。それ以外の場合はお楽しみください:)

于 2012-08-17T15:53:29.283 に答える
0

明確化: LEFT JOIN は、左側のテーブルと WHERE 条件に関係なく、右側のテーブルに何もない場合でも取得するため、最終的に何が必要ですか。右側のテーブルを where に追加すると、実質的に内部結合として作成されます。明示的に男性、スウェーデン語、グループ 4 のみが必要ですか? もしそうなら、私は通常の結合で行います

SELECT DISTINCT 
      M.ID 
   FROM Member M
      LEFT OUTER JOIN Experience E
         ON M.ID = E.MemberID 
      LEFT OUTER JOIN Qualification Q
         ON M.ID = Q.MemberID 
      LEFT OUTER JOIN Language L 
         ON M.ID = L.MemberID 
      LEFT OUTER JOIN Member_Interests MI
         ON M.ID = MI.MemberID 
      LEFT OUTER JOIN Group_Members GM
         ON M.ID = GM.MemberID 
   WHERE 
          1=1 
      AND M.Gender = 'male' 
      AND L.Name IN ( 'Swedish' ) 
      AND GM.GroupID = 4 

実質的に LEFT JOIN から INNER JOIN に変更され、性別が男性、言語がスウェーデン語、グループが 4 のレコードのみが取得されます。クエリを少し理解して交換するのに役立つように、以下を示します。

SELECT DISTINCT 
      M.ID 
   FROM Member M
      JOIN Language L 
         ON M.ID = L.MemberID 
         AND L.Name IN ('Swedish')
      JOIN Group_Members GM
         ON M.ID = GM.MemberID 
        AND GM.GroupID = 4
   WHERE 
          1=1 
      AND M.Gender = 'male' 

他の LEFT JOIN エントリは、返される個別のメンバー "ID" 値の最終的な要求に関係がないため、削除しました。使用しない場合は、なぜ参加するのですか。

于 2012-08-17T15:31:00.003 に答える