Sql server 要编写此SQL Server查询而不使用";不在「;

Sql server 要编写此SQL Server查询而不使用";不在「;,sql-server,Sql Server,问题是: 查找在开票期间未进行采购的客户列表 我使用不在中进行了以下查询,但我想编写一个不使用不在中的查询。什么是更好的选择?我会使用连接吗 SELECT customers.cus_code, customers.cus_balance FROM customers WHERE customers.cus_code NOT IN (SELECT invoices.cus_code FROM invoices) ORDER by customers.cus_code 一个选项是使用左连接重新

问题是:

查找在开票期间未进行采购的客户列表

我使用
不在
中进行了以下查询,但我想编写一个不使用
不在
中的查询。什么是更好的选择?我会使用连接吗

SELECT customers.cus_code, customers.cus_balance
FROM customers
WHERE customers.cus_code NOT IN (SELECT invoices.cus_code FROM invoices) 
ORDER by customers.cus_code

一个选项是使用
左连接重新表述查询:

SELECT
    t1.cus_code,
    t1.cus_balance
FROM customers t1
LEFT JOIN invoices t2
    ON t1.cus_code = t2.cus_code
WHERE t2.cus_code IS NULL
ORDER by t1.cus_code

如果在联接列上设置了正确的索引,则这可能比当前的
查询具有性能优势。

您可以使用左联接并检查右表值为null的位置,如下所示:

SELECT customers.cus_code, customers.cus_balance
FROM customers left join invoices on invoices.cus_code = customers.cus_code
WHERE invoices.cus_code IS NULL
ORDER by customers.cus_code
基本上,使用左联接可以从第一个表中选择与第二个表有或没有关系的所有记录。通过过滤第二个表的字段为null的位置,只得到绿色圆圈的左侧部分,该部分不相交


您也可以尝试不存在的版本。这可能(也可能不会)产生更好的计划。有些人宁愿生存也不愿生活。如果该列允许null,则肯定存在差异

 SELECT customers.cus_code, customers.cus_balance
 FROM customers
 WHERE  NOT EXISTS (SELECT * FROM invoices WHERE  
    invoices.cus_code=customers.cus_code ) 
 ORDER by customers.cus_code

这是一个非常简单的问题。逻辑上相同的任何备选方案都可能会优化为类似的方案。因此,如果避免使用不在
中的
的原因是“性能原因”,那么您不太可能通过更改它而获胜。如果这不是原因,也许您可以详细说明避免直接代码的原因是什么?