0

なぜこれが機能しないのか混乱しています。このタイプの構文を数回使用しましたが、これは髪の毛を抜くようになりました。

2つのテーブルがあります。

tableA

regId name    regStatus
1     George  1
2     Jenny   1
3     Penny   1
4     James   1
5     Preston 1
6     Jamie   0

TableB

activeRegId passiveRegID Status
1            2           1
1            3           1
1            4           0
6            1           1

私がやろうとしているのはtableA、where(tableA.regstatus = 0)と。を除いたすべての行を返すことです(tableB.status = 1 for a user regid = 1)

使用する必要はありませんNOT IN (select ...)

これまでの私の質問:

    select top 10 
        tA.regId, tA.name
    from 
        tableA tA 
    left OUTER JOIN 
        tableB tB ON tB.activeRegId = tA.regid AND tB.passiveRegID <> 1 
                     AND tB.status <> 1 AND tB.passiveRegID IS NULL
    where 
        tA.regStatus = 1
        and tA.regid <> 1

私が期待しているのは次のとおりですが、tableAJamieを除くすべてのユーザーを受け入れています。

regId name
4     James
5     Preston
4

2 に答える 2

1

LEFT OUTER JOINのON句からいくつかの述語を移動し、代わりにWHERE句の述語として使用する必要があると思います。

提供されたデータに基づいて、述語がどうあるべきか正確にはわかりませんが、LEFT OUTER JOINのON句に含める述語は、テーブルAではなくテーブルBから行を除外するためだけに機能します。

LEFT OUTER JOINを使用すると、WHERE句の述部によって除外されない限り、テーブルAのすべてのレコードを取得できます。

編集 コメントに基づいて、これはうまくいくと思います。ここで、「loggedInUserId」は、ログインしているユーザーの表AのregIdです。

SELECT top 10
   tA.regId,
   tA.name
FROM tableA tA1
JOIN tableA tA2
ON (tA1.regId <> tA2.regId
    AND tA2.regStatus <> 0)
LEFT OUTER JOIN tableB tB
ON (tA1.regId = tB.activeRegId
    AND tA2.regId = tB.passiveRegID
    AND tB.Status <> 0)
WHERE tA1.regId = 'loggedInUserId'
AND tB.activeRegId IS NULL

ログインしたユーザーをブロックしたユーザーも除外するには:

SELECT top 10
   tA.regId,
   tA.name
FROM tableA tA1
JOIN tableA tA2
ON (tA1.regId <> tA2.regId
    AND tA2.regStatus <> 0)
LEFT OUTER JOIN tableB tB
ON (
    --finding blocked users
    (tA1.regId = tB.activeRegId
     AND tA2.regId = tB.passiveRegID
     AND tB.Status <> 0)
    OR
    --finding blocking users
    (tA2.regId = tB.activeRegId
     AND tA1.regId = tB.passiveRegId
     AND tB.Status <> 0)
    )
WHERE tA1.regId = 'loggedInUserId'
AND tB.activeRegId IS NULL
于 2012-12-09T02:25:28.550 に答える
1

使用したくない場合は、使用したくないものを除外するために使用するNOT INのはどうですか?EXCEPT

SELECT regId
  FROM tableA
EXCEPT
SELECT tA.regId
  FROM tableA tA
  JOIN tableB tB ON (tB.activeRegId = tA.regid AND tB.passiveRegID = 1 AND tB.status = 1)
  WHERE tA.regStatus = 0
于 2012-12-09T03:06:27.913 に答える