2014-01-15 73 views
3

我有表T1,列C1,C2和表T2,列C3,C4,C5。我想从T1中删除记录,其中C1 = C3 AND C2 = C4和C5 ='123'。什么将是我试过以下查询通过连接多列删除查询

DELETE FROM T1 WHERE (C1,C2) = SELECT (C3,C4) FROM T2 WHERE C5 = '123' 

但这是行不通的。

回答

5

SQL Server中没有WHERE (x,y) = (a,b)语法,很抱歉。这是你如何执行删除,基于连接,无论多少列参与加入:

DELETE t1 
    FROM t1 
    INNER JOIN t2 
    ON t1.c1 = t2.c3 
    AND t1.c2 = t2.c4 
    WHERE t2.c5 = '123'; 
1

SQL Server支持一个额外的FROM子句DELETE语句。

DELETE FROM T1 
FROM T1 
INNER JOIN T2 
    ON T1.c1 = T2.c3 
    AND T1.c2 = T2.c4 
    WHERE c5 = '123'; 
2

可以使用exists做到这一点:

DELETE FROM T1 
    WHERE exists (SELECT 1 FROM T2 WHERE C5 = '123' and t2.c3 = t1.c1 and t2.c4 = t1.c2)) 

一般情况下,使用exists比使用in使用子查询,因为空白可导致后者做奇怪的方式行为更好。