1

TOTAL()集計関数を使用する SQL クエリがあります。

SELECT
    c.Id,
    c.Name,
    ...
    b.BatchNumber,
    TOTAL(d.OrderedAmount) as TotalOrderedAmount
FROM OrderProducts a
LEFT JOIN WarehouseProducts b ON a.WarehouseProductId = b.Id
...
WHERE a.OrderId = @OrderId
AND (e.Status = @OrderedStatus OR e.Status IS NULL)

(わかりやすくするために不要な行は削除されています)

このクエリは、結果が見つからない場合でも少なくとも 1 つの行を返すため、すべての列が DBNull になります (推測します)。このクエリの結果を DataTable に読み込もうとすると、null 値が原因で ConstraintException が発生します。

TOTAL()行をに置き換えると0 as TotalOrderedAmount、返される行数は 0 になり、すべて正常に動作します。

使用してみましWHERE a.Id IS NOT NULLたが、何を試しても、常に少なくとも 1 つの行が返されるようです。

集計関数を使用しても、製品が見つからない場合に返される行数が 0 になるように、このクエリを変更するにはどうすればよいですか?

4

1 に答える 1

1

これが、SQL での集計クエリのしくみです。SQLite のドキュメントには、これについて次のように書かれています。

SELECT ステートメントが GROUP BY 句のない集計クエリである場合、結果セット内の各集計式はデータセット全体で 1 回評価されます。結果セット内の各非集計式は、データセットの任意に選択された行に対して 1 回評価されます。各非集計式には、任意に選択された同じ行が使用されます。または、データセットに含まれる行が 0 の場合、各非集計式は、完全に NULL 値で構成される行に対して評価されます。

結果セット内の集計式と非集計式を評価することによって作成された結果セット データの単一行は、GROUP BY 句を使用しない集計クエリの結果を形成します。GROUP BY 句のない集計クエリは、入力データの行がゼロであっても、常に 1 行のデータを返します。

空の結果を許可するにはTOTAL、最も外側のクエリから集計関数を削除する必要があります。この値を引き続き取得するには (結果レコードがある場合)、サブクエリを使用します。

SELECT
    c.Id,
    c.Name,
    ...
    b.BatchNumber,
    (SELECT TOTAL(d.OrderedAmount)
     FROM SomeTable d
     WHERE d.x = c.y  -- or however d is related to the other tables
    ) AS TotalOrderedAmount
FROM OrderProducts a
JOIN ...              -- without d here
WHERE ...
于 2013-05-05T10:04:52.740 に答える