21

次のテーブルがあります。

Users
Banned

SELECT u.*
FROM Users
WHERE u.isActive = 1
    AND
      u.status <> 'disabled'

ユーザーが Banned テーブルに含まれている可能性がある行を含めたくありません。

これを行う最善の方法は何ですか?

サブクエリを where 句に入れると、次のようになります。

u.status <> 'disabled' and not exist (SELECT 1 FORM Banned where userId = @userId)

LEFT JOIN を行うのが最善の方法だと思いますが、どうすればそれを行うことができますか?

4

4 に答える 4

30

this answerによると、SQL-Server では使用NOT EXISTSがより効率的ですLEFT JOIN/IS NULL

SELECT  *
FROM    Users u
WHERE   u.IsActive = 1
AND     u.Status <> 'disabled'
AND     NOT EXISTS (SELECT 1 FROM Banned b WHERE b.UserID = u.UserID)

編集

完全を期すために、これは私が a でそれを行う方法ですLEFT JOIN:

SELECT  *
FROM    Users u
        LEFT JOIN Banned b
            ON b.UserID = u.UserID
WHERE   u.IsActive = 1
AND     u.Status <> 'disabled'
AND     b.UserID IS NULL        -- EXCLUDE ROWS WITH A MATCH IN `BANNED`
于 2012-10-29T20:06:33.963 に答える
8

LEFT JOINBanned で ingから得た値が次のNULLとおりであることを確認するだけです。

SELECT U.*
FROM Users U
    LEFT JOIN Banned B ON B.userId = U.userId
WHERE U.isActive = 1
    AND U.status <> 'disabled'
    AND B.userId IS NULL -- no match in the Banned table.
于 2012-10-29T19:57:19.920 に答える
5
select u.*
from Users u
left outer join Banned b on u.userId = b.userId
where u.isActive = 1
    and u.status <> 'disabled'
    and b.UserID is null
于 2012-10-29T19:56:40.423 に答える
-1
SELECT u.*
FROM Users u
LEFT JOIN Banned b ON u.userId = b.userId AND b.userRoles = 'VIP'
WHERE u.isActive = 1 AND b.id IS NULL

結果が必要で、何かを除外する必要があり、テーブルのキー ID ではない場合に使用します。

于 2015-05-07T11:11:04.630 に答える