0

在我的 postgres 数据库上:

当我做

SELECT* FROM ETIQUETTES WHERE DO_PIECE='BL7591'

我有

...|do_piece|ar_ref    |...
---------------------------
...|BL7591  |40L.PA.NAT|...
---------------------------
...|BL7591  |37LL.POM. |...

当我做

SELECT* FROM F_DOCLIGNE WHERE DO_PIECE='BL7591'

我有

...|do_piece|ar_ref    |...
---------------------------
...|BL7591  |46L-E.PA.N|...
---------------------------
...|BL7591  |37LL.POM. |...

然后当我用 IN 做我的请求时

SELECT* FROM ETIQUETTES AS a WHERE DO_PIECE='BL7591' AND a.AR_REF IN (SELECT AR_REF FROM F_DOCLIGNE WHERE DO_PIECE='BL7591')

我已经预料到了

...|do_piece|ar_ref    |...
---------------------------
...|BL7591  |37LL.POM. |...

但是当我用 NOT IN 提出请求时

SELECT* FROM ETIQUETTES AS a WHERE DO_PIECE='BL7591' AND a.AR_REF NOT IN (SELECT AR_REF FROM F_DOCLIGNE WHERE DO_PIECE='BL7591')

我一无所有

...|do_piece|ar_ref    |...
---------------------------

代替

...|do_piece|ar_ref    |...
---------------------------
...|BL7591  |40L.PA.NAT|...

我已经尝试过 NOT EXIST 或 LEFT JOIN / NULL 但结果总是一样的......我不明白为什么以及如何得到好的结果......你能帮我理解我的错误吗?

4

1 回答 1

1

如果列NULL中有F_DOCLIGNE.AR_REF,这是预期的行为 - 并且是 的常见陷阱NOT IN

这就是你可以重写的方式NOT EXISTS- 你没有这样的问题:

SELECT e.* 
FROM ETIQUETTES AS e 
WHERE e.DO_PIECE = 'BL7591' 
  AND NOT EXISTS 
      (SELECT 1 
       FROM F_DOCLIGNE AS d 
       WHERE d.DO_PIECE = 'BL7591'
         AND d.AR_REF = e.AR_REF
      );

在 Postgres 中,我认为LEFT JOIN / IS NULL效率比NOT EXISTS

SELECT e.* 
FROM ETIQUETTES AS e 
  LEFT JOIN F_DOCLIGNE AS d 
    ON  d.DO_PIECE = 'BL7591'
    AND d.AR_REF = e.AR_REF
WHERE e.DO_PIECE = 'BL7591' 
  AND d.AR_REF IS NULL ;

现在,如果没有 row withNULL并且您的数据与您所说的完全一样,则不应发生这种情况。NOT IN查询应返回一行,其中'BL7591' , '37LL.POM.'

我建议您检查查询中的表名和列名,并在列前加上表别名 - 以确保没有拼写错误。

于 2013-10-25T10:50:32.433 回答