0

私が使用する場合:

SELECT *
  FROM "moves"
 INNER
  JOIN "move_conditions"
    ON "move_conditions"."move_id" = "moves"."id"
 INNER
  JOIN "conditions"
    ON "conditions"."id" = "move_conditions"."condition_id"
 WHERE "conditions"."id" IN (29, 3)

これにより、条件のIDが29または3である正しいテーブルが返されます。

ただし、試してみると:

SELECT *
  FROM "moves"
 INNER
  JOIN "move_conditions"
    ON "move_conditions"."move_id" = "moves"."id"
 INNER
  JOIN "conditions"
    ON "conditions"."id" = "move_conditions"."condition_id"
 WHERE "conditions"."id" NOT IN (29, 3)

結果は正しくありません。ID29または3の条件が結果に含まれます。彼らはすべきではありません。これを修正するにはどうすればよいですか?

4

1 に答える 1

1

条件のいずれかが29または3の場合、移動を失格にするという意味ですか?そのためのサブクエリを試してみます。

SELECT *
  FROM "moves"
WHERE moves.id
NOT IN 
    (SELECT /* Don't know if PG infers or would be faster
                 with the DISTINCT that is implied by NOT IN */
      moves.id FROM 
      move_conditions 
      INNER JOIN
      conditions
    ON move_conditions.condition_id=conditions.id
    WHERE conditions.id IN (29,3)
    )

またはあなたは試すことができます

SELECT *
  FROM moves
EXCEPT
SELECT *
  FROM "moves"
INNER
JOIN "move_conditions"
   ON "move_conditions"."move_id" = "moves"."id"
INNER
JOIN "conditions"
ON "conditions"."id" = "move_conditions"."condition_id"
WHERE "conditions"."id" IN (29, 3)

私はそれがはるかに遅いと予想しますが。

;NOT EXISTSの代わりに使用する最初のバージョンを変換できます。NOT INPGのバージョンはそれらを異なる方法で最適化し、一方が他方よりも高速である可能性があります。

于 2012-12-13T18:42:39.917 に答える