SQL Server查询从表中删除连接的结果

时间:2013-09-04 14:47:21

标签: sql sql-server-2005

我不是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.emailTablesPPTMAILLISTC)中有2个单独的表称为相同(PPTMAILLISTAB)。

两个数据库具有相同的结果(我可以使用连接找到,即。)

SELECT *
FROM PPTMAILLISTC.dbo.emailTables tab1
    INNER JOIN PPTMAILLISTAB.dbo.emailTables tab2
        ON tab1.email = tab2.email

我想从PPTMAILLISTC.dbo.emailTables删除此联接的结果。

2 个答案:

答案 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.emailtab2.email。如错误消息所示,select子查询的in列表只能包含一列。

编辑:

这实际上更容易写为:

DELETE FROM PPTMAILLISTC.dbo.emailTables
    WHERE email IN (SELECT tab2.email
                    FROM PPTMAILLISTAB.dbo.emailTables tab2
                   );

您无需在in子查询中进行联接。