2017-02-09 6 views
0

2つのテーブルがあります(マスタ - 詳細関係)。マスタテーブルには、同じマスタレコードの詳細レコード数を記録する列(合計)があります。この列はパフォーマンス上の理由によるものです)。ここでは、テーブルの仕様は以下のとおりです。総計が正確でないこれらのマスタレコードの検索方法

table: MySum 
column: id 
column: total (total of MyDetail records for the same MySum record) 

table: MyDetail 
column: name 
column: MySum 

詳細レコードの削除は、マスター表の合計が正確でない場合があり、私はその合計正確ではありませんこれらのマスタレコードを検索したいと思いますので。ここに私が持っているSQLがあります。しかし、それはゼロレコードを生成し、私はこれが実際のデータに基づいて正しくないことを知っています。

select s.id, s.total from MySum s where s.total <> (select count(*) from MyDetail d where s.id = d.MySum group by d.MySum) 

正しいSQL文は何ですか?

私はMS SQL Serverを使用しており、データベース固有のステートメントは大丈夫です。しかし、一般的なステートメントは良いでしょう。

ありがとうございます!

答えて

1

whereで計算したい場合は、できます。あなただけではなく、唯一の相関サブクエリが必要group by

select s.id, s.total 
from MySum s 
where s.total <> (select count(*) 
        from MyDetail d 
        where s.id = d.MySum 
       ); 

EDIT:あなたは、カウントをしたい場合

は、その後、使用joingroup by

select s.id, s.total, d_cnt 
from MySum s left join 
    (select d.MySum, count(*) as d_cnt 
     from MyDetail d 
     group by d.MySum 
    ) d 
    on s.id = d.MySum 
where s.total <> d_cnt or not (s.total = 0 and d_cnt is null); 
+1

それは、カウント(なければなりません* )。 OPのテーブルデザインは次の通りです:_(同じMySumレコードのMyDetailレコードの合計)_ – cha

+0

あなたのご意見ありがとうございました。あなたのコードをテストしたところ、正しい結果が得られませんでした。 – curious1

+0

ゴードン、私はそれを働かせた。ここに最終的な声明があります。 sum(d.mysum)ではなくcount(d.mysum)を使用します。私はそれを選択できるようにあなたの答えを更新していただけますか?さらに、私は文でcount(d.mysum)も返すことができますか? – curious1

関連する問題