回答

收藏

删除与相交

技术问答 技术问答 226 人阅读 | 0 人回复 | 2023-09-13

我有两个表,它们的列数相同,没有主键(我知道,这不是我的错)。现在,我需要删除表B中存在的表A中的所有行(它们相等,每行30列)。
) l2 V( n( H9 Z) B, L* {, |我认为最直接的方法是执行INNER JOIN并解决我的问题。但是,所有列的写条件(担心NULL)也不尽人意(也许是因为我的表也不尽人意)。
6 B) @- g$ D! @: M, u; e  o我要用INTERSECT。我不知道该怎么做?这是我的第一个问题:
' H' A! T: y: a1 X6 Y3 T我试过了(SQL Fiddle):+ U2 Q' ]( w/ `% H
declare @A table (value int, username varchar(20))
4 n$ a# H5 s8 r( E" E% l1 J' cdeclare @B table (value int, username varchar(20))
( Z  u! ~% \8 o& o8 F0 Z7 Winsert into @A values (1, 'User 1'), (2, 'User 2'), (3, 'User 3'), (4, 'User 4')1 V; U) k9 \0 k' m1 A# t) l6 o
insert into @B values (2, 'User 2'), (4, 'User 4'), (5, 'User 5')
" A$ Q3 V0 m2 C1 ?& p, Y( oDELETE @A + a0 L+ j* U7 B
    FROM (SELECT * FROM @A INTERSECT SELECT * from @B) A
% l& ^# N! M  a但是所有行均已从table中删除@A。- H0 o# R! j/ \+ w5 K8 u
这使我想到第二个问题:为什么命令DELETE @A FROM @B从表中删除所有行@A?. C1 [+ \, _- K7 [% z& ?+ j
                ; q* C3 T0 A2 D2 K& k; L
解决方案:3 s: ^1 N& V  [0 A) g5 `
               
. Q" D( @2 U3 M1 y! n5 ^) u; N7 t; g6 G; d) A1 a4 E, ^

+ b6 ~* c( p4 r0 z- e$ u                试试这个:! l9 r1 ~) d$ Z3 t
DELETE a
) n# l7 Q+ z8 V1 O' d  KFROM @A a7 Q2 ?" s3 ~- P! k! @0 }' [
WHERE EXISTS (SELECT a.* INTERSECT SELECT * FROM @B)! W# H% @) f/ L2 n7 H
从@A中删除,对于@A中的每个记录,都有一个匹配项,其中@A中的记录与@B中的记录相交。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则