PostgreSQL的“不在”和子查询

我试图执行这个查询:

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

但是我没有得到任何结果。 我testing了一下,我知道语法有问题。 在MySQL中,这样的查询完美工作。 我已经添加了一行以确保有一个mac不存在于consols表中,但仍然没有给出任何结果。

使用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 ) 

使用NOT IN时,还应该考虑NOT EXISTS,它会默默地处理空例。

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

您也可以使用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”列上的索引可能会提高性能。