7

SQLクエリの句でタプル(ありがとう、a_horse_with_no_name)を比較することは可能ですか? WHEREそうすれば、これを変換できます:

/* This is actually a sub-sub-sub-query in the middle *
 * of an incredibly complex stored procedure.         */
SELECT ISNULL(SUM(DT.DetailField), 0)
FROM   DetailTable DT
WHERE  DT.ForeignKey = ...
AND    EXISTS (/* I know this sub-sub-sub-sub-query *
                * will return at most one row.      */
               SELECT 'X'
               FROM   HeaderTable HT
               WHERE  HT.HeaderKey    = DT.HeaderKey
               AND    HT.HeaderField1 = ...
               AND    HT.HeaderField2 = ...)

これに似たものに:

SELECT ISNULL(SUM(DetailField), 0)
FROM   DetailTable DT
WHERE  DT.ForeignKey = ...
AND    (SELECT HT.HeaderField1, HT.HeaderField2
        FROM   HeaderTable HT
        WHERE  HT.HeaderKey = DT.HeaderKey) = (..., ...)
4

4 に答える 4

5

書き込み

AND(SELECT HT.HeaderField1、HT.HeaderField2
        FROM HeaderTable HT
        WHERE HT.HeaderKey = DT.HeaderKey)=(...、...)

確かに可能です。少なくともOracleとPostgreSQLでは

副選択が複数の行を返すかどうかわからない場合は、を次のように変更することもできます=IN

于 2011-02-04T16:41:46.207 に答える
5

あなたが探しているのは内部結合です:

SELECT ISNULL(SUM(DetailField), 0)
FROM   DetailTable DT
INNER JOIN HeaderTable HT ON HT.HeaderKey = DT.HeaderKey
WHERE  DT.ForeignKey = ...
AND    HT.HeaderField1 = ...
AND    HT.HeaderField2 = ...)
于 2011-02-04T16:46:06.233 に答える
2

ここでテーブルではなくレコードを比較しようとしているようです。実際、クエリの結果を比較しています。

Oracle と MySQL では完全に可能です。次のクエリは有効で、ジョブを実行します。

SELECT (SELECT foo, bar FROM wathever) = (SELECT fuu, baz FROM another);

フィールドを 1 対 1 で比較し、すべてが一致する場合は 1 (一致しない場合は 0) を返します。サブクエリが複数の行を返す場合、SQL エラーが発生します。この式は、WHERE 句などの他の場所でも使用できます。

postgreSQL の更新

@tsionyx が指摘したように、PostgreSQL では、サブクエリは複数の列を返すことができません。行の値の型を返すことは可能です:

SELECT (SELECT ROW(foo, bar) FROM wathever) = (SELECT ROW(fuu, baz) FROM another);
于 2011-02-04T16:58:20.340 に答える
1

ゴランの答えは私にとって最もよく見え、私はそれに投票しました。別のオプションを追加するだけです.SQL Serverを使用しているため、サブクエリから複数の列を柔軟に取得する方法はouter apply. 次のように 2 つの値 (タプル) を比較できます。

select  *
from    SomeTable t1
outer apply
        (
        select  *
        from    SomeOtherTable t2
        where   t1.Stuff = t2.Unit
        ) sub1
outer apply
        (
        select  *
        from    YetAnotherTable t3
        where   t1.Stuff = t3.jetser
        ) sub2
where   sub1.col1 = sub2.col1
        and sub1.col2 = sub2.col2
于 2011-02-04T22:46:50.503 に答える