4

誰かが私のSQLステートメントを再確認して適切な操作と一般的な常識的なアプローチを見つけることができますか?

状況は次のとおりです。AccountNumberKeyという名前の列に結合された、1対多の関係を持つ親子テーブルがあります。子テーブルには、合計する必要のある数値列があります。

データは、特定のAccountNumberKey値を持つすべての子レコードが、2つの数値列で常に同じ値を持つようになっています。これらのテーブルを結合し、AccountNumberKeyごとに、これら2つの列の合計を一時テーブルに入れます。各AccountNumberKeyを指定して、単一の子レコードの列を合計するだけで済みます。

以下のいくつかのサンプルデータは、これをより明確にするでしょう(私は願っています):

Parent Table Columns


ParentID    InstitutionID    AccountNumberKey  

1       LocalHost            1873283  
2       Acme Brokers         3627389    
3       Dewey, Cheatem       1392876
4       NCC1701              8837273
5       Peyton Place         9981273


Child Table Columns


ChildID     AccountNumberKey    Value1      Value2       ProposalNumber
1               1873283         1000        100         58
2               1873283         1000        100         59
3               1873283         1000        100         60
4               1873283         1000        100         61

これが私のSQLステートメントです:

    SELECT   DISTINCT  Parent.InstitutionID, AccountNumberKey, SUM(Child.Value1 + Child.Value2) as total
        INTO   #TempTable
        FROM         Parent 
            INNER JOIN
              Child ON Parent.AccountNumberKey = Child.AccountNumberKey 

        GROUP BY Parent.InstitutionID, Parent.AccountNumberKey, Child.ProposalNumber

目標は、テーブルをリンクし、データを一時テーブルに配置して、次のようにすることです。

TempTable columns


InstitutionID       AccountNumberKey        Total
LocalHost           1873283             1100

私のSQLクエリはマスターを渡しますか?グループ化に関しては私は天才ではなく、これがA)正しく、B)うまくいく方法なのか、それとももっと良い参加方法があるのか​​疑問に思いました。

ありがとう!

4

3 に答える 3

3

このクエリはあなたが望むように見える結果を与えるでしょう:

SELECT
   P.InstitutionID,
   P.AccountNumberKey,
   Total = C.Value1 + C.Value2
FROM
   Parent P
   INNER JOIN (
      SELECT DISTINCT AccountNumberKey, Value1, Value2
      FROM Child
   ) C ON P.AccountNumberKey = C.AccountNumberKey

しかし、私は他の人が言ったことをエコーし​​たいと思います。デザインについて何かできるのであれば、正規化されていないので、そうすべきです。子テーブルのValue1とValue2は、親に関するものであるため、実際には親テーブルに属します。子テーブルの2つの行に、同じAccountNumberKeyの異なる値のセットがある場合はどうなりますか?あなたのデータはすべて間違っているでしょう、そして誰がビジネスにどんな種類の恐らく悲惨な結果をもたらす可能性があるか知っていますか?この場合、上記のDISTINCTは失敗し、親行に対して2行を返します。

アップデート:

ラリークは言った:

おそらく親テーブルに属する必要があるvalue1とvalue2に関しては、将来的には、ProposalNumber/AccountNumberKeyの組み合わせごとに異なる可能性があります。

この場合、私があなたに与えたクエリは奇妙な結果を与えるでしょう。AccountNumberに使用する値のセットをどのように決定しますか?常に最新のProposalNumberが必要ですか?Value1とValue2の個別のセットごとに行を表示しますか?使用する現在のProposalNumberを見つけるために結合する別のテーブルはありますか?

于 2010-02-06T01:55:41.593 に答える
1

まず、「特定のAccountNumberKey値を持つ子レコードは、常に2つの数値列で同じ値を持つ」ということが真実である場合、テーブルスキーマは適切な第3正規形(3NF)ではありません。、キー、およびデータフィールドとして、ごとAccountNumberKeyに1行の別のテーブルが必要です。また、クエリをこのテーブルに結合して(を使用して)、を取得する 必要があります。AccountNumberKeyValue1Value2AccountNumberKeyValue1Value2

次に、この状況では、キーではない親テーブル列の親テーブルに子テーブルを結合しないでください。これにより、デカルト積が発生します(出力には、結合の両側の各行に複数の行が含まれ、実際には、これらのレコードを2回または3回カウントします...)AccountNumberKey親テーブルのキーですか?

そうでない場合は、親テーブルで子テーブルのFKとして使用する必要がある唯一の列はキー列ParentIDです。

そうである場合(AccountNumberKey親テーブルで一意の場合)、Value1列とValue2列は、子テーブルではなく親テーブルにある必要があります。

于 2010-02-06T01:16:45.937 に答える
1

AccountNumberKeyは結合によって生成される一意ではないため、結合によってこれらの結果が得られることはありません。

LocalHost           1873283             1100

4回、子レコードごとに1回、集計すると、値として4400が生成されます。

于 2010-02-06T01:25:49.110 に答える