SQL面试

假设有两个表,tab1,tab2,分别有产品名称和产品价格,现在我想用tab2的价格替换tab1的价格,我写的语句是Update tab1 set tab1.产品价格=tab2.产品价格 where tab1.产品名称=tab2.产品名称
结果出现错误,提示为:列前缀 'tab2' 与查询中所用的表名或别名不匹配。请问应该怎样写,

SQL语句是不支持多表同时更新的。

应该这样写

update tab1 set tab1.产品价格 = (select tab2.产品价格 from tab2 where tab2.产品名称 = tab1.产品名称) where tabl1.产品名称 in (select tab2.产品名称 from tab2)


后面的where tab1.产品名称 in (select tab2.产品名称 from tab2) 这句保证了如果tab1的产品在tab2没有记录时不会出错。


在开发中,数据库来回换,而有些关键性的语法又各不相同,这是一件让开发人员很头痛的事情.本文总结了Update语句更新多表时在SQL Server,Oracle,MySQL三种数据库中的用法.我也试了SQLite数据库,都没成功,不知是不支持多表更新还是咋的.

在本例中:

我们要用表gdqlpj中的gqdltks,bztks字段数据去更新landleveldata中的同字段名的数据,条件是当landleveldata 中的GEO_Code字段值与gdqlpj中的lxqdm字段值相等时进行更新.

SQL Server语法:
UPDATE
         {
          table_name WITH ( < table_hint_limited > [ ...n ] )
          | view_name
          | rowset_function_limited
         }
         SET
         { column_name = { expression | DEFAULT | NULL }
         | @variable = expression
         | @variable = column = expression } [ ,...n ]

     { { [ FROM { < table_source > } [ ,...n ] ]

         [ WHERE
             < search_condition > ] }
         |
         [ WHERE CURRENT OF
         { { [ GLOBAL ] cursor_name } | cursor_variable_name }
         ] }
         [ OPTION ( < query_hint > [ ,...n ] ) ]

SQL Server示例:
update a
set a.gqdltks=b.gqdltks,a.bztks=b.bztks
from landleveldata a,gdqlpj b
where a.GEO_Code=b.lxqdm

Oracle语法:
UPDATE updatedtable
     SET (col_name1[,col_name2...])=
(SELECT col_name1,[,col_name2...]
FROM srctable [WHERE where_definition])

Oracel 示例:
update landleveldata a
set (a.gqdltks, a.bztks)=
(select b.gqdltks, b.bztks from gdqlpj b
   where a.GEO_Code=b.lxqdm)

MySQL语法:
UPDATE table_references
     SET col_name1=expr1 [, col_name2=expr2 ...]
     [WHERE where_definition]

MySQL 示例:
update landleveldata a, gdqlpj b
set a.gqdltks= b.gqdltks,
a.bztks= b.bztks
   where a.GEO_Code=b.lxqdm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值