回答

收藏

根据多列条件更新行

技术问答 技术问答 87 人阅读 | 0 人回复 | 2023-09-12

我试图根据另一个表中的另外两个列更新表中的一些行。作为玩具模型,请考虑两个表:People,具有first_name,last_name和has_license列;具有栏first_name和last_name驱动程序。现在,我想更新第一个表,以便has_license
! {( L2 D5 x. [) E  E6 \4 Z+ J=’Y’来查找也在Drivers表中的first_name和last_name所有元组。' Z5 p& _2 @' |0 N
我可以做:
# V( ?5 n* R0 ^, M0 w1 eUPDATE people SET has_license='Y'WHERE first_name   last_name IN (SELECT first_name   last_name FROM drivers)(在我的实际查询中,first_name和last_name是外部设置的记录ID和日期,子查询更复杂,涉及join / EXCEPT子句。). C" h0 R% v9 f7 G- u' Z* m8 _
这很笨拙,根据值可能会出错。理想情况下,我可以这样做sql中创元组:
1 b" f* p7 l$ m9 c( ?9 u; GUPDATE people SET has_license='Y'WHERE (first_name,last_name) IN (SELECT first_name,last_name FROM drivers)但这是无效的SQL(根据SQLite)。那我觉得有可能吗?! L* H+ j* Y# ?/ B
(另一个问题是这些表没有主键,尤其是单列键。如果不是这样,我会用它来简单地识别它。, [+ r, d, g0 ]  ]2 Q" N
                                                                $ Z+ }8 s6 ?, X, l0 M, k# \2 a
    解决方案:                                                               
% ^4 n. @. m/ R* y+ s                                                                这是 SQL
, x: @( }6 H3 Q* U! [, w只需使用一个JOIN!
" }0 m" g3 z$ z( @" m! b3 EUPDATE people SET has_license='Y'FROM PeopleINNER JOIN Drivers    ON Drivers.First_name = people.first_name    AND Drivers.Last_name = people.last_name在SQL Server在中间,我只使用别名,但对SQLite不熟悉语法的复杂性。这应该是有效的AFAIK。
  A4 t( e6 F. c  S编辑
! W/ Q0 p; n* m; p使用以下版本EXISTS:
" @4 ~9 n3 t/ f( `$ i9 |UPDATE people SET has_license='Y'WHERE EXISTS (SELECT 1 FROM Drivers              WHERE Drivers.First_name = people.first_name              AND Drivers.Last_name = people.last_name)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则