0

Sql Server 2000 に古いデータベースがあり、まだ維持する必要があります。次の 2 つのクエリがあります。

SELECT col1,
       COUNT(*)
FROM   someTable
WHERE  YEAR = 2012
       AND c_id = 1
       AND p_id = 4
GROUP BY
       col1


SELECT COUNT(*)
FROM   someTable
WHERE  YEAR = 2012
       AND c_id = 1
       AND p_id = 4
       AND col1 = '11111'

最初のクエリでこの同じ値 '11111' を見つけると、2 番目のクエリよりも 3 行多く表示されます。これはどのように可能ですか?この kol1 の値だけに問題があります。それはまた、異なる合計を生成します。

データベースの破損などによってこの問題が発生する可能性はありますか?

この更新を試しました:

update sometable
set col1=ltrim(rtrim(col1))
where c_id=1
and p_id=4
and year=2012

このエラーがスローされました:

RID '16140001100032303132811300400' のインデックス エントリが、インデックス ページ (1:76450)、インデックス ID 2、データベース 'xxx' で見つかりませんでした。

4

3 に答える 3

1

たぶん、あなたのテーブルには、対応するフィールドに同じ値を持つ4つの行があります。私は次のようなものを想定しています

col1 | year | c_id | p_id | any_field
11111| 2012 | 1    | 4    | value_1
11111| 2012 | 1    | 4    | value_2
11111| 2012 | 1    | 4    | value_3
11111| 2012 | 1    | 4    | value_4

ただし、any_fieldは選択されておらず、他の重複フィールドがあるため、col1でグループ化されたレコードは1つだけ表示されます。

于 2013-01-18T07:06:27.533 に答える
0

最初の例では、col1でグループ化しており、2番目の例では、フィルタリングする正確な値を指定しています。col1の一部の値の後に末尾にスペースがある可能性があります。例えば...

'11111'
'11111 '
'11111  '

... GROUP BYに3行が表示されますが、2番目のクエリでは最初の行のみが結果を返します。RTRIM()関数を使用してみてください

SELECT RTRIM(col1) AS col1,
       COUNT(*)
FROM   someTable
WHERE  YEAR = 2012
       AND c_id = 1
       AND p_id = 4
GROUP BY
       RTRIM(col1)


SELECT COUNT(*)
FROM   someTable
WHERE  YEAR = 2012
       AND c_id = 1
       AND p_id = 4
       AND RTRIM(col1) = '11111'
于 2013-01-18T07:01:51.577 に答える
0

私を助けてくれてありがとう。行の更新に失敗した後、インデックスを再構築し、col1 を ltrim(rtrim()) で更新したところ、正しい結果が得られました。

于 2013-01-18T08:04:12.870 に答える