回答

收藏

根据多列条件更新行

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

我试图根据另一个表中的另外两个列更新表中的一些行。作为玩具模型,请考虑两个表:People,具有first_name,last_name和has_license列;具有栏first_name和last_name驱动程序。现在,我想更新第一个表,以便has_license
" C7 w( N. q" K5 w0 Z=’Y’来查找也在Drivers表中的first_name和last_name所有元组。
5 z4 J! d& ~" L& a9 c7 F- S6 R我可以做:8 e: g; `) k) b% X4 n  X
UPDATE 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子句。)
6 J& n4 z* u1 |6 k这很笨拙,根据值可能会出错。理想情况下,我可以这样做sql中创元组:! H6 v5 r1 z7 n# E" `" u
UPDATE people SET has_license='Y'WHERE (first_name,last_name) IN (SELECT first_name,last_name FROM drivers)但这是无效的SQL(根据SQLite)。那我觉得有可能吗?
; r7 q1 \" u8 ^( C(另一个问题是这些表没有主键,尤其是单列键。如果不是这样,我会用它来简单地识别它。5 n7 W0 H+ y  x: n7 K$ x8 `
                                                               
8 P6 Z& d3 C' O, m0 u" a; a# b    解决方案:                                                                ) M; W! t" N9 h: Y% Q- ]
                                                                这是 SQL
$ Q+ O% ]8 j4 G2 I# @9 [只需使用一个JOIN!) t% N0 x' H5 A7 F; @9 m% k4 u. j% D
UPDATE 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。
1 C9 n& l# ^# T8 Y5 U; h: K' N# M编辑
0 V9 T$ ]) G/ u6 g. ~使用以下版本EXISTS:! S! N, n; A3 U
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)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则