我有两个表:



我需要第一张表中的“ 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 EXISTSNOT 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。)

10-08 02:58