以下の組み合わせテーブルから  
A番号とB番号が同じグループIDであるものを削除するSQLを作成したいと思っています。  
抽出するSQLを作成したのですが、削除するSQLがうまく作れません。  
アドバイスいただけると嬉しいです。

抽出するSQLを作成しました。

```

    SELECT
        組み合わせテーブル.ID,
        組み合わせテーブル.A番号,
        組み合わせテーブル.B番号,
        InnerJoinTB1.番号,
        InnerJoinTB1.グループID,
        InnerJoinTB2.番号,
        InnerJoinTB2.グループID
    FROM 
        組み合わせテーブル
    INNER JOIN 
        番号テーブル AS InnerJoinTB1 ON 組み合わせテーブル.A番号 = InnerJoinTB1.番号
    INNER JOIN 
        番号テーブル AS InnerJoinTB2 ON 組み合わせテーブル.B番号 = InnerJoinTB2.番号
    WHERE
        InnerJoinTB1.グループID != InnerJoinTB2.グループID
    
```

取得したい組み合わせテーブルのIDが取得できていることを確認したのですが、  
組み合わせテーブルから該当するレコードを削除するSQLをどのように構築していいのかよくわかりません…  
単純にSELECT箇所をDELETEにすればよいのかと考えたのですが、INNER JOINしているため、うまくいきませんでした。

```

    DELETE
    FROM 
        組み合わせテーブル
    INNER JOIN 
        番号テーブル AS InnerJoinTB1 ON 組み合わせテーブル.A番号 = InnerJoinTB1.番号
    INNER JOIN 
        番号テーブル AS InnerJoinTB2 ON 組み合わせテーブル.B番号 = InnerJoinTB2.番号
    WHERE
        InnerJoinTB1.グループID != InnerJoinTB2.グループID
    
```

番号テーブル  
ID グループID 番号  
100 1 1000  
200 1 2000  
300 2 3000  
400 3 4000

組み合わせテーブル  
ID A番号 B番号  
1 1000 2000  
2 3000 1000  
3 4000 1000  
4 2000 1000  
※A番号とB番号が番号テーブルに紐づく
CC BY-SA 4.0
2018-10-19T08:13:00.147
49450
2018-10-20T04:19:50.057
12842
question
postgresql
PostgreSQLの削除SQLについて
`組み合わせテーブル.ID`でレコードが一意になるのであれば、元のSELECT文を副問い合わせにして削除対象のIDを指定するのがよいと思います。

```

    /* 例 */
    DELETE
    FROM
        組み合わせテーブル
    WHERE
        組み合わせテーブル.ID IN (
            SELECT 組み合わせテーブル.ID
            FROM
                組み合わせテーブル
            INNER JOIN
                番号テーブル AS InnerJoinTB1 ON 組み合わせテーブル.A番号 = InnerJoinTB1.番号
            INNER JOIN
                番号テーブル AS InnerJoinTB2 ON 組み合わせテーブル.B番号 = InnerJoinTB2.番号
            WHERE
                InnerJoinTB1.グループID != InnerJoinTB2.グループID
        )
    
```

あるいは、PostgreSQL拡張を用いるのであれば、`using`句を用いて`番号テーブル`を指定する方法もあると思います。(参考:
[PostgreSQLのDELETE文の説明](https://www.postgresql.jp/document/10/html/sql-
delete.html))
CC BY-SA 4.0
2018-10-20T04:19:50.057
49470
2018-10-20T04:19:50.057
20098
49450
answer