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