0

我不是 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 引入时,只能在选择列表中指定一个表达式。

dbo.emailTables基本上,在 2 个单独的数据库 (PPTMAILLISTC和) 中有 2 个单独的表,它们都称为相同 ( PPTMAILLISTAB)。

两个数据库的结果相同的地方(我可以使用 join ie 找到)

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

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

4

2 回答 2

1

您可以摆脱 IN 的使用,只需使用内部 SELECT 语句并将其转换为 DELETE 并仅引用您实际想要影响的表的别名(tab1),如下所示:

DELETE  tab1
FROM    PPTMAILLISTC.dbo.emailTables tab1
        INNER JOIN PPTMAILLISTAB.dbo.emailTables tab2 ON tab1.email = tab2.email
于 2013-09-04T14:59:09.457 回答
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子查询中进行连接。

于 2013-09-04T14:53:15.817 回答