Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 博士后不在不工作_Sql_Postgresql_Notin - Fatal编程技术网

Sql 博士后不在不工作

Sql 博士后不在不工作,sql,postgresql,notin,Sql,Postgresql,Notin,如果我使用: 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" 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)

结果是不正确的。结果中包含id为29或3的条件。他们不应该这样。如何解决此问题?

您的意思是,如果某个移动的条件为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)
虽然我希望这会慢得多


您可以将第一个版本转换为使用
不存在
而不是
不存在
;PG的版本对这些进行了不同的优化,其中一个可能比另一个更快。

请发布示例数据(例如,在上)
不在
在PostgreSql中肯定正常工作这似乎没问题,你能发布你的整个查询吗?可能是来自tbl1、tbl2的
,其中
样式查询?可能提供的示例没有它应有的准确度,但确保在选中的条件下没有
NULL
值:不在(NULL,29,3)尝试重写到conditions.id 29和conditions.id 3。。看看他们是否没事。或者也可以尝试强制条件。id::int。