ここまでの説明は、スカラーまたはカラムサブクエリー、つまり、単一値または値のカラムを返すサブクエリーについてでした。行サブクエリーは、単一行を返し、そのために複数のカラム値を返すことができるサブクエリーバリアントです。行サブクエリーの比較のための正当な演算子は次のとおりです。
= > < >= <= <> != <=>
次に、2 つの例を示します。
SELECT * FROM t1
WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT * FROM t1
WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
どちらのクエリーでも、テーブル t2
に id = 10
を持つ単一行が含まれている場合、このサブクエリーは単一行を返します。この行に t1
内のいずれかの行の col1
および col2
値に等しい col3
および col4
値が含まれている場合、WHERE
式は TRUE
であり、各クエリーはこれらの t1
行を返します。t2
行の col3
および col4
値が、いずれの t1
行の col1
および col2
値にも等しくない場合、この式は FALSE
であり、このクエリーは空の結果セットを返します。サブクエリーによって行が生成されない場合、この式は不明 (つまり、NULL
) です。サブクエリーによって複数の行が生成される場合は、行サブクエリーが最大で 1 行しか返すことができないため、エラーが発生します。
式 (1,2)
や ROW(1,2)
は、行コンストラクタとも呼ばれます。この 2 つは同等です。行コンストラクタと、サブクエリーによって返される行には、同じ数の値が含まれている必要があります。
行コンストラクタは、2 つ以上のカラムを返すサブクエリーとの比較に使用されます。サブクエリーが単一カラムを返すと、これは行ではなく、スカラー値として見なされるため、少なくとも 2 つのカラムを返さないサブクエリーで行コンストラクタを使用することはできません。そのため、次のクエリーは構文エラーで失敗します。
SELECT * FROM t1 WHERE ROW(1) = (SELECT column1 FROM t2)
行コンストラクタは、ほかのコンテキストでも正当です。たとえば、次の 2 つのステートメントは意味的に同等です (また、オプティマイザによって同じように処理されます)。
SELECT * FROM t1 WHERE (column1,column2) = (1,1);
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
次のクエリーは、「テーブル t2
内にも存在するテーブル t1
内のすべての行を検索する」という要求にこたえます。
SELECT column1,column2,column3
FROM t1
WHERE (column1,column2,column3) IN
(SELECT column1,column2,column3 FROM t2);