我有两个表:
我需要第一张表中的“ clientes.id_cliente,clientes.nombre,clientes.apellido,clientes.empresa,clientes.correo”,但要删除第二张表中出现的人(签约人)
我尝试了这个(还有很多其他事情):
SELECT clientes.id_cliente, clientes.nombre, clientes.apellido, clientes.empresa, clientes.correo
FROM clientes
INNER JOIN contratos_clientes
ON clientes.id_cliente != contratos_clientes.id_cliente
结果如下:
我尝试了不同的方法,但一无所获。
最佳答案
从概念上讲,这是NOT EXISTS
或NOT IN
,但优化效果可能不佳。如果发布@a_horse_with_no_name的查询效果不佳,您还可以执行以下操作:
SELECT clientes.id_cliente, clientes.nombre, clientes.apellido,
clientes.empresa, clientes.correo
FROM clientes
LEFT JOIN contratos_clientes
ON clientes.id_cliente = contratos_clientes.id_cliente
WHERE contratos_clientes.id_cliente IS NULL
LEFT JOIN
要求左表(此处为clientes
表)中的所有行,如果存在则与右表(ON
)中的相应行(由contratos_clientes
定义)连接。对于左侧的每一行,如果给定行的值不存在,则右侧表的该行部分的所有值均为NULL
。在您的情况下,这些行是您想要的行-因此只需检查右侧的值是否为NULL
。最好使用不能单独使用NULL
的值,例如PK字段。顺便说一句,这种查询-“ A中的行与B中的行不匹配”-被称为反联接。
(注意:通常,当您只想要JOIN的左侧部分时,需要使用
SELECT DISTINCT
,以便在左侧的给定行与右侧的多行匹配时删除重复项。但是在这种情况下,只需在右侧查找NULL
行,并且在左侧每行最多插入一个这样的“虚拟”行,因此您不必重复,因此不需要DISTINCT
。)