如何使用 not in / not like 比较 SQL 中不同表的值

How to use not in / not like to compare values from different tables in SQL

我有 SQL 2019 年这两个表 - 订单和客户各自的列

id,order_comment,customer_id

在订单中并且

id,customer_name

在客户中。 Order_comment 是 ntext 类型。 我需要用 customer_name 值更新 order_comment。 更新应该是这样的:

update o set order_comment=concat(c.customer_name,';',o.order_comment)
from
orders o
left join customer c on c.id=o.customer_id
where o.id=1 and
convert(varchar(255),order_comment) not  in 
(select b.customer_name from customer b where o.customer_id=b.id)

如果 customer_name 已经是 order_comment 的一部分,则不应进行更新。 当 order_comment 为空时,上述查询工作正常。但是如果评论中已经有文本,它会不断更新值。我应该如何更改查询,以便当评论部分中已有文本时,更新只发生一次?

有很多方法可以实现您的目标,当然最好的方法取决于您的设置和您的进一步目标。 为了使您的更新语句与您的尝试尽可能相似,您可以这样做:

UPDATE o SET order_comment=CONCAT(c.customer_name,';',o.order_comment)
FROM
orders o
LEFT JOIN customers c ON c.id=o.customer_id
WHERE o.order_comment IS NULL OR o.order_comment NOT LIKE CONCAT(c.customer_name,'%');

还有其他可能性,如子选择、不存在等,最好的办法是尝试最适合你的方法。您可以在此处查看此示例: fiddle