2017-06-30 4 views
3

SQL照会を最適化しようとしているため、JVMで応答を処理する必要はありません。SQL照会はIN where節と似ていますが、OR条件の代わりにAND条件を使用します

たちはエントリを持つテーブルを次のようしている考えてみましょう:

+-----------+-------------+ 
| Column1 | Column2  | 
+-----------+-------------+ 
|val11  |val21  | 
|val11  |val22  | 
|val11  |val23  | 
|val12  |val21  | 
|val12  |val24  | 
+-----------+-------------+ 

今、私は私がColumn2s val21、val22、val23値にマッピングされた列を有するcolumn1sなりますクエリを実行します。

IN句と似ていますが、IN句がIN句の値のORでデータを検索するため、これらの値の間でANDを検索したいと考えています。句INについて

SELECT Column1 from table 
WHERE Column2 IN (val21, val22, val23) 

はval11とval12の両方をもたらすであろう(句のようval21とデータを確認、またはval22またはval23であろう)。

代わりに、val1と同じように、Column1が3つのval21、val22、val23のすべてのマッピングを持つかどうかを確認するクエリを使用したいと考えています。

Informix DBの使用。

+0

Informix DBを使用しています。 –

+2

[分裂した私たちの立場:リレーショナル部門のSQL](https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/) – GarethD

答えて

6

これは「関係分割」と呼ばれます。これはまた、(それは、少なくともを有するものを返すcolumn2に割り当てられたこれらの3つの値、より多くを持っている値を含むであろうと

select column1 
from x 
where column2 in ('val21', 'val22', 'val23') 
group by column1 
having count(distinct column2) = 3; 

注:

このための通常のアプローチは、以下のようなものですこれらの3つの値)

+0

ありがとう@a_horse_with_no_name、それは働いた。 –

0

これも行うことができますが、IN2に続く配列よりもcolumn2のレコードの方が少ない場合が返されることに注意してください。このテクニックでは、指定されたcolumn1グループに対して、column2のすべての値が配列内で一致することを確認します。 NULL値を適切に処理するようにしてください。

SELECT column1 
FROM t 
WHERE t.column2 IN (11,21) 
AND NOT EXISTS (SELECT 1 
     FROM t t1 
     WHERE t1.column2 NOT IN (11,21) 
     AND t1.column1 = t.column1) 
+0

質問に特定の値が記載されている場合、なぜ11と21の値を使用しているのかは不明です。 –

関連する問題