2016-12-06 5 views
1

私は現在H2データベースで作業していますが、H2データベースエンジンは複数列のサブクエリで実行されるNOT INをサポートしていません。は明確にするために、サブクエリは、具体的見つけようとしている:それは代替SQLが必要

編集サブクエリとしてfamidparamidの同じ組み合わせを持ってどこ

DELETE FROM AllowedParam_map 
WHERE (AllowedParam_map.famid,AllowedParam_map.paramid) NOT IN (
SELECT famid,paramid 
FROM macros 
LEFT JOIN macrodata 
ON macros.id != macrodata.macroid 
ORDER BY famid) 

は基本的に私はallowedparam_mapから行を削除したいですallowedparam_mapを除外するために、macrodataには存在しないfamid/paramidの組み合わせがあり、したがってON macros.id != macrodata.macroidです。私はSQLでひどいので、これは完全に間違った方法かもしれません。

編集2:

Macros 
| ID | NAME | FAMID | 
| 0 | foo | 1 | 
| 1 | bar | 1 | 
| 2 | baz | 1 | 

MacroData 
| ID | MACROID | PARAMID | VALUE | 
| 0 |  0 |  1  | 1024 | 
| 1 |  0 |  2  | 200 | 
| 2 |  0 |  3  | 89.85 | 

AllowedParam_Map 
| ID | FAMID | PARAMID | 
| 0 | 1 |  1  | 
| 1 | 1 |  2  | 
| 2 | 1 |  3  | 
| 3 | 1 |  4  | 

パラメータがあたり、家族ごとに許可されています。はここで適切なスキーマについていくつかの詳細情報です。 allowedParam_mapテーブルにfamid=1paramid=4のエントリが含まれていることに注意してください。マクロ0(別名「foo」)にはparamid=4のエントリがありません。これを展開すると、別のfamid=1マクロにparamid=4が含まれている可能性がありますが、わかりません。 macrodataテーブルのデータに基づいて、未使用のパラメータをallowedParam_mapテーブルから取り除きたいとします。

+0

'famid'と' paramid'はどのテーブルにありますか? –

+0

@ThorstenKettner 'famid'と' paramid'は 'macros'テーブルにあります – bss36504

+0

あなたの編集に関して:"マクロデータに存在しないfamid/paramidの組み合わせ "?列がマクロテーブルに存在する場合、それらがマクロデータテーブルにどのように存在するか、存在しないか?テーブルに実際に含まれる列を表示することができます。いくつかのサンプルデータと期待される結果を与えることさえあれば、大きな助けになります。 –

答えて

2

INNOT INは常にEXISTSNOT EXISTSと交換することができます。

最初のいくつかのポイント:

  • あなたはもちろん不必要であるあなたのサブクエリにORDER BYを使用しています。
  • テーブルを外部結合しているため、存在を要求するときには効果がありません。そのため、外部結合テーブルのフィールドを検索し、内部結合または非結合のいずれかを行い、クエリから削除する必要があります。とにかくすべての非関連のレコード(macros.id != macrodata.macroid)に参加するために(それの奇妙な。

あなたが外を削除することができますので、あなたのクエリから macrodataに参加し、テーブル macrosの両方の famidparamid常駐コメント欄で言います。あなたが取得する:あなたが famidがテーブル macrosにあり、 paramidがテーブル macrodataであることを今言うように

、あなたがAllowedParam_mapに存在してペアではなくaformentionedテーブルにアップ見てみたい、あなたが探しているように見えます単純な内部結合。

DELETE FROM AllowedParam_map 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM macros m 
    JOIN macrodata md ON md.macroid = m.id 
    WHERE m.famid = AllowedParam_map.famid 
    AND md.paramid = AllowedParam_map.paramid 
); 
2

代わりnot existsを使用することができます。

DELETE FROM AllowedParam_map m 
WHERE NOT EXISTS (SELECT 1 
        FROM macros LEFT JOIN 
         macrodata 
         ON macros.id <> macrodata.macroid -- I strongly suspect this should be = 
        WHERE m.famid = ?.famid and m.paramid = ?.paramid -- add the appropriate table aliases 
       ); 

注:

  • を私は強く<>=べきであると思います。 <>はこの文脈で意味をなさない。
  • ?を適切なテーブルエイリアスに置き換えます。とにかくNOT INより優れています。
  • NOT EXISTS値の1つがNULLであれば、それは期待したことを行います。
+0

何らかの理由で、私の元のクエリは 'NOT EXISTS'で全く機能しませんでした。構文エラーが発生しましたが、' NOT IN'に変更するだけで、複数の列のサブクエリについて不平を言います。 – bss36504

+0

@ bss36504。 。 。 '? 'を適切なテーブル名に置き換えましたか? –

関連する問題