2016-07-23 36 views
0

这是我想在MySQL来执行查询特定行:删除可以有NULL值的一些列

DELETE from Connection 
where 
(sourceIp , destinationIp, 
destinationPort, 
sourceServerId, 
destinationServerId, 
sourceProcessId, 
destinationProcessId) IN (Select 
    sourceIp, 
     destinationIp, 
     destinationPort, 
     sourceServerId, 
     destinationServerId, 
     sourceProcessId, 
     destinationProcessId 
from 
    (Select 
     sourceIp, 
      destinationIp, 
      destinationPort, 
      sourceServerId, 
      destinationServerId, 
      sourceProcessId, 
      destinationProcessId 
    from 
     Connection 

    where 
     sourceIp = '12.43.34.53' 
     and destinationIp = '12.43.34.65' 
     and destinationPort = '3306' 
     and ((sourceServerId = '1' 
     and destinationServerId = '2' 
     and sourceProcessId = '1' 
     and destinationProcessId = '2') 
     or (sourceServerId IS NULL 
     and destinationServerId = '2' 
     and destinationProcessId = '2') 
     or (sourceServerId = '1' 
     and sourceProcessId = '1' 
     and destinationServerId is NULL))) as C); 

我做多个选择,因为我不能在from子句指定同一个目标表。上面的查询执行。我的表看起来像这样:

  1. SOURCEIP,destinationIp,destinationPort,sourceServerId,destinationServerId,sourceProcessId,destinationProcessId '12 .43.34.53' ,'12 .43.34.65' , '3306',NULL, '2',NULL, '2'
  2. SOURCEIP,destinationIp,destinationPort,sourceServerId,destinationServerId,sourceProcessId,destinationProcessId '12 .43.34.53' ,'12 .43.34.65' , '3306', '1',NULL, '1',NULL
  3. sourceIp,destinationIp,destinationPort,sourceServerId,destinationServerId,sourceProcessId,destinationProcessId '12 .43.34.53','12 .43.34.65','3306','1','2','1','2 '

以上查询只删除最后一行(#3)。但是,如果在IN中删除查询并将其余部分执行为Select,那么我会得到所有3行。是否因为带有空值的IN不起作用?有关如何修改此查询以使其删除所有3行的任何建议。 (所有的IDS和IPS,目的端口一起使表中的行是唯一的)

回答

1

哇,你不需要任何的选择,并且在这方面的能力使用IN不会给你想要的,如果任何结果这些字段返回NULL ..........您的问题与您的WHERE声明。

你上面清理可以简化为:

DELETE from Connection 
where 
    sourceIp = '12.43.34.53' 
    and destinationIp = '12.43.34.65' 
    and destinationPort = '3306' 
    and ((sourceServerId = '1' 
    and destinationServerId = '2' 
    and sourceProcessId = '1' 
    and destinationProcessId = '2') 
    or (sourceServerId IS NULL 
    and destinationServerId = '2' 
    and destinationProcessId = '2') 
    or (sourceServerId = '1' 
    and sourceProcessId = '1' 
    and destinationServerId is NULL)) 
; 

你为什么不删除正确记录的问题是由于WHERE子句条件中的优先顺序的。我不打算试图解开这个,因为你的文章需要一些工作,如示例数据和期望的结果,因为我确信会有更好的方式来编写你的查询。