4

Cluster2 番目のテーブルに関連する" " と呼べるテーブルがありますElement

集まる:

Id Group Ele1 Ele2 Ele3
1   1     1    2     3
2   1     4   NULL   9
3   2     5    8     7

エレメント

Id Name
1  'A'
2  'b'
3  'c'
4  'd'
5  'z'
6  'j'
7  't'
8  'r'
9  'e'

ここで、クラスターを削除する必要があります

DELETE FROM Cluster
WHERE   Cluster.Group= 1

しかし、行を削除する前に、Cluster関連するすべての行を削除する必要がありますElement

DELETE FROM Element
WHERE Id IN (SELECT Ele1 Ele2 Ele3 
             FROM Cluster 
             WHERE Cluster.Group= 1)

しかし、このクエリは機能しないので、何が欠けていますか?

4

7 に答える 7

4

これを試して:

DELETE FROM Element
WHERE Id IN (SELECT Ele1
             FROM Cluster 
             WHERE Cluster.[Group] = 1
                   And Ele1 Is Not NULL

             Union 

             SELECT Ele2
             FROM Cluster 
             WHERE Cluster.[Group] = 1
                   And Ele2 Is Not NULL

             Union 

             SELECT Ele3 
             FROM Cluster 
             WHERE Cluster.[Group] = 1
                   And Ele3 Is Not NULL
)
于 2013-05-24T12:40:41.317 に答える
3

コンパクトでクリーン:

DELETE FROM Element
WHERE Id IN (
    SELECT
        Ele
    FROM Cluster AS T
    CROSS APPLY (VALUES
        (T.Ele1)
        , (T.Ele2)
        , (T.Ele3)
    ) AS X (Ele)
    WHERE T.Group= 1
)
于 2013-05-24T13:14:02.577 に答える
1

複数の列を持たないようにテーブルを正規化することが最良の答えです。

G Mastro の答えは、既存のテーブル デザインを考えると適切です。

正規化されたように見える方法...だから、次のようにすることができます:

delete from Element 
where Id in ( select EleId from  GroupElements where Group_id = 1 )


*Cluster* 

Id Group
1   1   
2   1   
3   2   

*GroupElements*

Group_id EleId
1   1
1   2
1   3
1   4
1   9
2   5
2   8
2   7


*Element*

Id Name
1  'A'
2  'b'
3  'c'
4  'd'
5  'z'
6  'j'
7  't'
8  'r'
9  'e'
于 2013-05-24T13:17:38.313 に答える
1

いくつかの実用的な解決策がありますが、なぜそれらが機能し、あなたの試みが失敗するのかについての説明はありません。

INオペレーターは、チェックする値のリストを必要としています。最も単純には、次のようになりWHERE column IN (value1, value2, value3...)ます。リストでも機能しSELECTます: WHERE column IN (SELECT somecolumn FROM sometable).

クエリは、リストとして使用できる単一の列ではなく、3 つの異なる列を返します。これは、IN 演算子の構文として正しくありません。G Mastros のソリューションでは、UNION 演算子を使用して、3 つの異なる選択クエリを 1 つの単一列の結果セットに結合します。

(ちなみに、UNION ALL重複した値は問題ではなく、UNION操作が遅くなるため、この場合に使用します。ただし、値の複数のコピーをチェックすると、よりパフォーマンスが低下する可能性があるため、クライアント統計を確認してくださいUNION)

StuffHappens は、UNPIVOT演算子を使用して、必要な 3 つの列を 1 つの結果セットに分割するのと同じ動作を取得しています。個人的にはUNION、主にUNPIVOT構文を理解するのが難しいため、 を使用します。

于 2013-05-24T13:03:28.687 に答える
1

更新しました

delete  from Element
where ID in
(
SELECT Item
   FROM 
      (SELECT [Group], Ele1, cast([Ele2] as int) Ele2, Ele3 FROM Cluster) p
   UNPIVOT(Item FOR Ele IN (Ele1, Ele2, Ele3) )AS unpvt
  )
于 2013-05-24T12:52:28.330 に答える
0
DELETE FROM Element
WHERE Id IN (SELECT Ele1
         FROM Cluster 
         WHERE Cluster.Group= 1) AND Id IN (SELECT Ele2
         FROM Cluster 
         WHERE Cluster.Group= 1) AND Id IN (SELECT Ele3
         FROM Cluster 
         WHERE Cluster.Group= 1)
于 2013-05-24T12:41:55.947 に答える