0

SELECTクエリを使用してテーブル変数からいくつかのデータを削除しようとしています。次のコードは完全に機能します。

DECLARE @sgID int
SET @sgID = 1234

DELETE FROM
    @tbl_users 
WHERE
    (userID NOT IN (
            SELECT
                userID 
            FROM
                [SGTable] 
            WHERE
                (sgID = @sgID)
            ))

私はこのクエリを高速化しようとしていますが、次のアプローチの方が良いかもしれないことを読んでいます。ただし、次のコードを使用すると、すべてのレコードがテーブル変数から削除されます。

DELETE
    tmp 
FROM 
    @tbl_Users tmp INNER JOIN
    [SGTable] sgu ON sgu.userID = tmp.userID 
WHERE
    (sgu.sgID <> @sgID)

私は(明らかに間違って)これらの2つのクエリが同じことをしたと仮定しました(サブクエリでuserIDが見つからないテーブル変数のすべてのuserIDを削除します)。明らかに読みやすく、保守しやすいので、誰かが2番目のクエリを機能させるためのアドバイスを提供できますか?

4

3 に答える 3

1

userIDをSGTable内の複数のsgIDに関連付けることは可能ですか?

その場合、ユーザーは別のsgIDにも関連付けられているため、sgID(@sgID)内のユーザーを削除します。

あなたが好むかもしれません:

DELETE tmp 
FROM @tbl_Users tmp 
LEFT OUTER JOIN [SGTable] sgu ON sgu.userID = tmp.userID AND sgu.sgID = @sgID
WHERE sgu.sgID IS NULL
于 2013-01-03T19:51:11.333 に答える
0

どうdelete where existsですか?

DELETE FROM mytable
WHERE EXISTS (
    SELECT *
    FROM ....)
;
于 2013-01-03T19:47:22.120 に答える
0

where句は「<>」ではなく「=」にするべきではありませんか?一致しないレコード(すべてのレコードである可能性があります)ではなく、一致するレコードを削除したいですよね?

于 2013-01-03T19:49:06.237 に答える