SQLクエリで「ゼロ除算」(メッセージ8134)が発生する理由を理解しようとしていますが、何かが足りないに違いありません。以下の特定のケースの理由を知りたいのですが、私は探していませんNULLIF
。または、CASE WHEN...
すでに知っているのと同じようなものです(もちろん、以下のような状況で使用できます)。
次のような計算列を持つSQLステートメントがあります
SELECT
TotalSize,
FreeSpace,
(FreeSpace / TotalSize * 100)
FROM
tblComputer
...[ couple of joins ]...
WHERE
SomeCondition = SomeValue
このステートメントを実行すると、上記のエラーメッセージでエラーが発生しますが、それ自体は問題ではありません。明らかTotalSize
に0である可能性があり、したがってエラーが発生する可能性があります。
今私が理解していないのはTotalSize
、計算された列をコメントアウトするときに列が0である行がないということです。これが当てはまらないことを、再確認しました。
次に、何らかの理由で、where句の条件で実際にフィルタリングする前に、結果セット全体に対して列の計算が実行されると思いましたが、これはa)意味がなく、b)エラーをaで再現しようとするとテストセットアップすべてが正常に機能します(以下を参照):
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0001',1)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0002',1)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0003',1)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0004',0)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0005',1)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0006',0)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0007',1)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (1,100,21)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (2,100,10)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (3,100,55)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (4,0,10)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (5,100,23)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (6,100,18)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (7,100,11)
-- This statement does not throw an error as apparently the row for ComputerID 4
-- is filtered out before computing the (FreeSpace / TotalSize * 100)
SELECT
TotalSize,
FreeSpace,
(FreeSpace / TotalSize * 100)
FROM
tblComputer
JOIN
tblHDD ON
tblComputer.ID = tblHDD.ComputerID
WHERE
IsServer = 1
私はかなり困惑していて、その理由を知りたいです。
事前のおかげで、正しい方向へのアイデアやポインタは大歓迎です
アップデート
これまでのご意見ありがとうございましたが、残念ながら問題の根本に近づいていないようです。ステートメントを少し削除して、1つのJOINを削除してもエラーなしで実行できる場合があります(一時的に削除した出力の追加の列に必要になります)。
JOINを使用するとエラーが発生する理由がわかりませんが、標準のINNER JOINは常に同じ行数以下を返すのではなく、それ以上を返すことはありませんか?
作業コード
SELECT
TotalSize,
FreeSpace
((FreeSpace / TotalSize) * 100)
FROM
MyTable1
INNER JOIN
MyTable2 ON
MyTable1.ID = MyTable2.Table1ID
WHERE
SomeCondition
コードの原因となるエラー
SELECT
TotalSize,
FreeSpace
((FreeSpace / TotalSize) * 100)
FROM
MyTable1
INNER JOIN
MyTable2 ON
MyTable1.ID = MyTable2.Table1ID
-- This JOIN causes "divide by zero encountered" error
INNER JOIN
MyTable3 ON
MyTable2.ID = MyTable3.Table2ID
WHERE
SomeCondition
また、カーソルを使用して結果を行ごとにループして運試しをしましたが、その場合はエラーは発生しませんでした(上記の2つのステートメントのどちらを試しても)。
コードのインデントが乱雑になって申し訳ありませんが、どういうわけか正しいフォーマットが適用されていないようです。
G。