我不是SQL Server专家,我正在努力解决这个问题。有人可以帮忙吗?
DELETE
FROM PPTMAILLISTC.dbo.emailTables
WHERE email IN (SELECT *
FROM PPTMAILLISTC.dbo.emailTables tab1
INNER JOIN PPTMAILLISTAB.dbo.emailTables tab2
ON tab1.email = tab2.email)
SQL Server Management Studio返回。
Msg 116,Level 16,State 1,Line 1
当未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式。
基本上,在2个独立的数据库(dbo.emailTables
和PPTMAILLISTC
)中有2个单独的表称为相同(PPTMAILLISTAB
)。
两个数据库具有相同的结果(我可以使用连接找到,即。)
SELECT *
FROM PPTMAILLISTC.dbo.emailTables tab1
INNER JOIN PPTMAILLISTAB.dbo.emailTables tab2
ON tab1.email = tab2.email
我想从PPTMAILLISTC.dbo.emailTables
删除此联接的结果。
答案 0 :(得分:1)
你可以摆脱IN的使用,只使用你的内部SELECT语句并将其转换为DELETE,并且只引用你真正想要影响的表的ALIAS(tab1),如下所示:
DELETE tab1
FROM PPTMAILLISTC.dbo.emailTables tab1
INNER JOIN PPTMAILLISTAB.dbo.emailTables tab2 ON tab1.email = tab2.email
答案 1 :(得分:0)
你需要这样的东西:
DELETE FROM PPTMAILLISTC.dbo.emailTables
WHERE email IN (SELECT tab1.email
FROM PPTMAILLISTC.dbo.emailTables tab1 INNER JOIN
PPTMAILLISTAB.dbo.emailTables tab2
ON tab1.email = tab2.email
);
即使两个表只有一列,*
也会解析为两列tab1.email
和tab2.email
。如错误消息所示,select
子查询的in
列表只能包含一列。
编辑:
这实际上更容易写为:
DELETE FROM PPTMAILLISTC.dbo.emailTables
WHERE email IN (SELECT tab2.email
FROM PPTMAILLISTAB.dbo.emailTables tab2
);
您无需在in
子查询中进行联接。