2016-03-03 42 views
0

我想在WHERE子句上使用SELECT进行更新。不幸的是,我搜索了唯一的例子,我发现在哪里设置UPDATE的值作为SELECT的结果。使用SELECT更新

只是要清楚,我不是在寻找这样的事情:

UPDATE Users 
SET AccountId = (
        SELECT RIGHT(lastName, 5) + RIGHT(UserId, 6) 
        FROM Users 
       ) 

我想要做的是这样的:

update cr_produtos set pr_ativo = 'N' where column = (select * from cr_produtos 
left join cr_produtomov_2 on pr_codebar = mo_codebar 
where mo_codebar is null and pr_estoqueatual = 0) 

我目前使用IB专家。

+0

您的语法无效,很清楚。你不能使用WHERE SELECT;它会是WHERE columnName =(SELECT ...)。'你的代码会变成'WHERE =(SELECT keyfield FROM ...)'或'WHERE IN(SELECT keyfields FROM ...) 。这也与Delph无关;这完全是一个SQL问题。你从Delphi代码执行语句的事实是无关紧要的。我已经删除了Delphi标签。 –

+0

是的,我知道语法错了。我想我对这个问题没有说清楚,对此抱歉。 我一直在使用WHERE IN(SELECT keyfields FROM),但使用*而不是字段。谢谢你,并为新秀的错误感到抱歉。 :) –

回答

0

你可以把EXISTSNOT EXISTS在子查询的前修复语法错误:

update cr_produtos 
    set pr_ativo = 'N' 
    where exists (select 1 
        from cr_produtos left join 
         cr_produtomov_2 
         on pr_codebar = mo_codebar 
        where mo_codebar is null and pr_estoqueatual = 0 
       ); 

我会感到惊讶,如果这是你真正想要的。更可能的是,您需要关联的子查询:

update cr_produtos 
    set pr_ativo = 'N' 
    where exists (select 1 
        from cr_produtomov_2 
        where pr_codebar = mo_codebar and 
         mo_codebar is null and pr_estoqueatual = 0 
       ); 
+0

嗨!它确实删除了语法错误,但没有完全达到我的目的。 在这种情况下,我使用select来创建我在cr_produtos表上没有的关于cr_produtomov_2的代码条列表。 使用EXISTS,它看起来像忽略SELECT和更新所有内容,尽管选择了。我不确定自己是否清楚。 –

+0

@AndreiAibel。 。 。你应该问*另一个问题,提供样本数据和期望的结果。 –