1

テーブル全体を選択して開始するクエリが必要です。最初のクエリからエントリを削除するクエリがさらにいくつかあります。いくつかのクエリを使用し、アプリケーションで結果を比較することでこれを達成しました。単一のクエリでこれを達成できるかどうか疑問に思っていました。

アルゴリズム

  1. テーブルからすべてのアカウント ID を選択

  2. parameter1 = true のテーブルから AccountID を選択します

  3. これらの一致を元のクエリ結果から削除します

  4. parameter2 = true のテーブルから AccountID を選択します

  5. 残りのクエリ結果からそれらの一致を削除します

  6. など、最大 N 個のパラメーター。

これは、mySQL と SQLite の両方と互換性がある必要もあります。

4

2 に答える 2

2

アルゴリズムを実装する最も直接的な方法は、複合 SELECT ステートメントを使用することです。

SELECT AccountID FROM MyTable
EXCEPT
SELECT AccountID FROM MyTable WHERE parameter1 = 1
EXCEPT
SELECT AccountID FROM MyTable WHERE parameter2 = 1

ただし、これは単一のWHERE式でも可能です。

SELECT AccountID
FROM MyTable
WHERE NOT (parameter1 = 1 OR
           parameter2 = 1 OR
           ...)
于 2013-03-18T15:47:04.317 に答える
2

私はあなたがこれを探していると思います:

SELECT AccountID FROM the_table
LEFT JOIN (
    SELECT AccountID FROM the_table
    WHERE
        parameter1 = true OR
        ... OR
        parameterN = true ;
) AS not_included USING (AccountID)
WHERE not_included.AccountID IS NULL -- only items with no match in the "not_included" sub-query

サブクエリは、not_includedいずれかのパラメータが に設定されているすべてのアイテムを返しますTRUE。実際には、これらのレコードを最終的な結果セットから除外したいと考えています。

the_table次に、このサブ結果にLEFT-JOIN (つまり、すべてのアイテム) します。この句は、 に存在するが存在しないWHERE...IS NULLアイテムを除外します。the_tablenot_included

したがって、除外したくない項目のみが最終結果セットに残ります。

于 2013-03-18T15:16:50.003 に答える