繁体   English   中英

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

[英]SQL Server query delete results of a join from a table

我不是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返回。

消息116,第16级,状态1,第1行
如果未使用EXISTS引入子查询,则只能在选择列表中指定一个表达式。

基本上,有2个单独的表都称为相同的( dbo.emailTables )在2个独立的数据库( PPTMAILLISTCPPTMAILLISTAB )。

这两个数据库的结果相同(我可以使用连接ie找出这些结果)

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

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

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

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

您需要这样的东西:

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 如错误消息所述, in子查询的select列表只能具有一列。

编辑:

这实际上更简单地写为:

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

您不需要在in子查询in联接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM