sql >> データベース >  >> RDS >> Sqlserver

警告の取得:集計またはその他のSET操作によってNULL値が削除されます

    ほとんどの場合、それについては何もするべきではありません。

    • ansi_warningsを設定すると、警告を無効にすることができます オフですが、これには他の効果があります。ゼロによる除算がどのように処理され、クエリがインデックス付きビュー、計算列、XMLメソッドなどの機能を使用する場合に失敗を引き起こす可能性があるかについて。
    • 一部の限られたケースでは、それを回避するためにアグリゲートを書き直すことができます。例えばCOUNT(nullable_column) SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END)として書き換えることができます。 ただし、これはセマンティクスを変更せずに簡単に実行できるとは限りません。

    これは、SQL標準で必要な単なる情報メッセージです。メッセージストリームに不要なノイズを追加することを除けば、悪影響はありません(SQLServerがNULLの読み取りをバイパスできないことを意味します。 行。オーバーヘッドが発生する可能性がありますが、警告を無効にしても、この点でより良い実行プランは得られません)

    このメッセージを返す理由は、SQLnullのほとんどの操作全体で伝播するためです。

    SELECT NULL + 3 + 7 NULLを返します (NULLに関して 未知の量として、これは? + 3 + 7 も不明です)

    しかし

    SELECT SUM(N)
    FROM   (VALUES (NULL),
                   (3),
                   (7)) V(N) 
    

    10を返します ヌルが無視されたという警告。

    ただし、これらはまさに必要なセマンティクスです。 一般的な集計クエリの場合。それ以外の場合は、単一のNULLが存在します つまり、すべての行にわたるその列の集計は、常にNULLを生成することになります。 これはあまり役に立ちません。

    下の最も重いケーキはどれ​​ですか? (画像ソース、クリエイティブ・コモンズの画像は私が変更(トリミングおよび注釈付き))

    3番目のケーキの重さを量った後、はかりが壊れたため、4番目のケーキに関する情報はありませんが、それでも円周を測定することはできました。

    +--------+--------+---------------+
    | CakeId | Weight | Circumference |
    +--------+--------+---------------+
    |      1 | 50     | 12.0          |
    |      2 | 80     | 14.2          |
    |      3 | 70     | 13.7          |
    |      4 | NULL   | 13.4          |
    +--------+--------+---------------+
    

    クエリ

    SELECT MAX(Weight)        AS MaxWeight,
           AVG(Circumference) AS AvgCircumference
    FROM   Cakes 
    

    返品

    +-----------+------------------+
    | MaxWeight | AvgCircumference |
    +-----------+------------------+
    |        80 |          13.325  |
    +-----------+------------------+
    

    技術的には、80が最も重いケーキの重量であると確実に言うことはできませんが(不明な数の方が大きい場合があるため)、上記の結果は、単に不明なものを返すよりも一般的に有用です。

    +-----------+------------------+
    | MaxWeight | AvgCircumference |
    +-----------+------------------+
    |         ? |          13.325  |
    +-----------+------------------+
    

    したがって、NULLを無視する必要があり、警告はこれが発生しているという事実を警告するだけです。



    1. マネージドPostgreSQLクラウドソリューションのベンチマーク:パート2-Amazon RDS

    2. Android:SQLiteデータベースの開閉

    3. トランザクションレプリケーションを作成する方法

    4. PIVOT、UNPIVOT、およびリバースPIVOTステートメントを理解する