PostgreSQL'NOT IN'和子查询

时间:2011-12-11 09:36:29

标签: postgresql subquery

我正在尝试执行此查询:

SELECT mac, creation_date 
FROM logs 
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)

但我没有结果。我测试了它,我知道语法有问题。在MySQL中,这样的查询非常有效。我添加了一行以确保mac表中不存在一个consols,但它仍然没有给出任何结果。

3 个答案:

答案 0 :(得分:126)

使用NOT IN时,应确保没有值为NULL:

SELECT mac, creation_date 
FROM logs 
WHERE logs_type_id=11
AND mac NOT IN (
    SELECT mac
    FROM consols
    WHERE mac IS NOT NULL -- add this
)

答案 1 :(得分:27)

使用NOT IN时,您还应该考虑NOT EXISTS,它会静默处理空案例。另请参阅PostgreSQL Wiki

SELECT mac, creation_date 
FROM logs lo
WHERE logs_type_id=11
AND NOT EXISTS (
  SELECT *
  FROM consols nx
  WHERE nx.mac = lo.mac
  );

答案 2 :(得分:6)

您还可以使用LEFT JOIN和IS NULL条件:

SELECT 
  mac, 
  creation_date 
FROM 
  logs
    LEFT JOIN consols ON logs.mac = consols.mac
WHERE 
  logs_type_id=11
AND
  consols.mac IS NULL;

“mac”列上的索引可能会提高性能。