繁体   English   中英

使用 join 和 where 子句更新查询

[英]Update query with join and where clause

我目前对我试图在表上执行的(相当简单的)更新语句感到困惑。 这两个表是这样的:

  1. 客户表有列

    customer_id [string] passwordisabled [boolean]
  2. 贷款表有列

    loan_id [string], customer_id [string & foreign key], cashregister_id [string]

如果它们是通过特定的收银机注册的,我想将passworddisabled属性更新为true 我使用了distinct命令,因为客户可以拥有多笔贷款。

这是我尝试过的:

update customer
set passworddisabled = true
from customer c
    join (select distinct loan_customerid, loan_cashregisterid
          from loan
         ) l
     on c.customer_id = l.loan_customerid  
where l.loan_cashregisterid = '1' 

似乎正在发生的事情是我的 where 子句被完全忽略了。 这导致所有客户的属性passworddisabled设置为true 我不完全确定这是怎么回事,所以我非常感谢一些关于这个查询实际在做什么以及如何解决它的建议。

以下是一些可行的数据: 客户 1---* 贷款

客户ID 姓名 密码禁用
1 佩德罗 错误的
2 桑德拉 错误的
3 彼得 真的
4 诺曼 真的
贷款编号 贷款客户ID 贷款收银机
1 1 1
2 1 1
3 4 2
4 2 1

在这种情况下,Pedro 和 Sandra 的 passworddisabled 属性应该设置为 true,因为他们有收银机 1 的贷款。

如果您需要更多信息,请告诉我。

再次感谢!

这是 Postgresql 的 join-like UPDATE语句的正确语法:

UPDATE customer AS c
SET passworddisabled = true
FROM loan AS l
WHERE c.customer_id = l.loan_customerid AND l.loan_cashregister = '1'; 

请参阅演示

但我建议使用EXISTS

UPDATE customer AS c
SET passworddisabled = EXISTS (
                         SELECT * 
                         FROM loan AS l 
                         WHERE c.customer_id = l.loan_customerid AND l.loan_cashregister = '1'
                       ); 

请参阅演示

如果是 MySQL,试试这个:

UPDATE 
customer c
JOIN (SELECT DISTINCT loan_customerid, loan_cashregisterid FROM loan ) l ON c.customer_id = l.loan_customerid
SET passworddisabled = TRUE 
WHERE l.loan_cashregisterid = '1'

对于更新查询,请始终在SET之前提及您的表名和关系

编辑事实上,您甚至可能不需要子查询,加入loan ,应该可以正常工作:

UPDATE 
customer c
JOIN loan l ON c.customer_id = l.loan_customerid
SET passworddisabled = TRUE 
WHERE l.loan_cashregisterid = '1'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM