2016-07-23 9 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句で同じターゲット表を指定することはできませんので、私は、複数の選択をしています。上記のクエリが実行されます。私のテーブルのようになります。 '12 .43.34.53' をdestinationProcessId、

  1. SOURCEIP、destinationIp、destinationPort、sourceServerId、destinationServerId、sourceProcessId、'12 .43.34.65' 、 '3306'、NULL、 '2'、NULL、 '2'
  2. SOURCEIP、destinationIp、destinationPort、sourceServerId、destinationServerId、sourceProcessId、 '12 .43.34.53' をdestinationProcessId、'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行すべてが得られます。それはnull値を持つ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句のあなたの条件の優先順位です。私はあなたのポストがあなたの質問を書く良い方法があると確信しているので、あなたのポストはサンプルデータや希望の結果のような仕事を必要とするので、これを解明しようとはしません。

関連する問題