2016-11-22 13 views
0

要件:各人が投稿した画像の数を知りたい。COUNT()は特定の列で0を返します。

したがって、次のようにテーブルスキーマを作成します。

Table=Person 
========== 
Id (PK) , Column1, Column2, LId (FK) 

Table=ListMaster 
============ 
Id (PK) , LId (Unique) 

Table = ListDetail 
=========== 
Id (PK), LId(FK), DataId(FK) 

Table = Image 
========= 
Id (PK), Column1, Column2 

とクエリSQL

SELECT Person.Id AS PersonId, 
     Person.Column1 AS PersonC1, 
     Person.Column2 AS PersonC2, 
     COUNT(Image.Id) AS ImageCount 
FROM Person 
LEFT OUTER JOIN ListMaster ON Person.LId = ListMaster.LId 
LEFT OUTER JOIN ListDetail ON ListDetail.LId = ListMaster.LId 
LEFT OUTER JOIN Data AS Image ON ListDetail.DataId = Image.Id 
GROUP BY Person.Id, 
     Person.Column1, 
     Person.Column2 

を使用し、私は彼が前に掲示しているイメージがありますが、いくつかの人の「ImageCountは」「0」を持って気づきます。

私のクエリを修正する方法を教えてください。あるいは論理的にも私が望むことをすることが可能ですか?私は自分のテーブルデザインについて間違いを犯していると思う。

私はImageCountが

2 
1 
0 
1 

を返す必要がありますが、それは

2 
1 
0 
0 

EDIT 1を返すCOUNT(Image.Id)AS期待

Sample Data 
======= 

Table = Person 

Id (PK)(bigint identity) | Column1 (nvarchar(max)) | Column2 (nvarchar(max)) | LId (FK) (bigint [null]) 

1 | Test 1 C1 | Test1 C2 | 1 

2 | Test 2 C1 | Test 2 C2 | 2 

3 | Test 3 C1 | Test 3 C2 | NULL 

4 | Test 4 C1 | Test 4 C4 | 37 

Table = ListMaster 

Id (PK)(bigint)(identity) | LId (Unique)(bigint) 

1 | 1 

2 | 2 

3 | 37 

Table = ListDetail 



    Id (PK)(bigint identity)| LId(FK)(bigint not null)| DataId(FK)(bigint not null) 
1 | 1 | 1 

2 | 1 | 2 

3 | 2 | 3 

4 | 37 | 4 

Table = Image 

Id (PK)(big int not null)(identity) | Column1 (nvarchar(max)) | Column2 (nvarchar(max)) 

1 | Location 1 | Dummy Data 1 

2 | Location 2 | Dummy Data 2 

3 | Location 3 | Dummy Data 3 

4 | Location 4 | Dummy Data 4 

:テーブルデザインを変更

EDIT 2 :サンプルデータを追加する

+2

'MyTable.LId' ?? –

+1

あなたのお問い合わせは、okですので、おそらくデータの問題です。 'COUNT()'と 'GROUP BY'を取り除き、' DATA。* 'を追加してグループ化する前にデータの結果を見るようにしてください。 –

+0

@JuanCarlosOropeza私はSELECT * FROM Imageを試しましたが、正しいデータが表示されていました。しかし、私はCOUNT()とGROUP BYを使用しようとすると、 "ImageCount"は "0"になります。 –

答えて

1

与えられたとして、あなたが期待値を返す必要がありますそれはあなたのクエリやデータのように見えます。これは実際のスキーマ、データ、およびクエリですか、この投稿を簡略化していますか?あなたの実際のデータには "test 1 C1"などの値は含まれていないと思われます。このテストには、これらのダミーのフィールド名と値を使ってDBを作成しましたか、これはあなたが実際に持っているものと同等ですか?これが実際のものではない場合は、単純化することで実際に問題を引き起こしていることがなくなった可能性があります。

予想される結果が得られないクエリがある場合は、クエリの一部を削除して、問題の場所を確認します。最初の結合だけで試してみて、期待どおりの結果が得られるかどうかを確認してください。それがうまくいけば、2回目の結合などを追加してください。GROUP BYを残してすべてのレコードをダンプするだけで、カウントだけでなく実際のレコードも見ることができます。

多くの原因が考えられます。たぶん、データはあなたが思うものではありません。たぶんいずれかの結合が間違ったフィールドを使用している可能性があります。異なるデータ型があり、変換が期待した結果を得られていないことが原因で問題に陥っている可能性があります。等

0

すべてのId, Column1, Column2は、あなたが言うように、あなたのImage.IdカラムがNOT NULL宣言され、場合あなたのLEFT JOIN sの場合、あなたはCOUNT(Image.Id)Person 0のを取得する必要があります唯一の理由は次のようになり、画像

SELECT Person.Id AS PersonId, 
     Person.Column1 AS PersonC1, 
     Person.Column2 AS PersonC2, 
     ListMaster.*, 
     ListDetail.*, 
     Data.* 
FROM Person 
LEFT OUTER JOIN ListMaster ON Person.LId = ListMaster.LId 
LEFT OUTER JOIN ListDetail ON ListDetail.LId = ListMaster.LId 
LEFT OUTER JOIN Data AS Image ON ListDetail.DataId = Image.Id 
ORDER BY Person.Id, 
     Person.Column1, 
     Person.Column2 
2

を持っているかどうかを確認するために、これを試してみてください指定されたPersonに対してImageが見つかりません。その場合、基礎となる結果のImage.IdNULLとなるため、COUNT(Image.id)はゼロになります。任意のListMasterのエントリを持っていないPersonがあります

  • :これはどちらかということを意味します。
  • ListMasterにはListDetailのエントリがありません。
  • のエントリを持たないListDetailエントリがあります。

...またはこれらのいくつかの組み合わせ。

あなたはすぐにあなたの既存のクエリに適切なテーブルのためのCOUNT Sを追加することによって、不足しているリンクをチェックすることができるはずです。

SELECT Person.Id AS PersonId, 
     Person.Column1 AS PersonC1, 
     Person.Column2 AS PersonC2, 

     -- NEXT TWO COUNTS ADDED FOR DEBUGGING 
     COUNT(ListMaster.LId) AS ListMasterCount, 
     COUNT(ListDetail.LId) AS ListDetailCount, 

     COUNT(Image.Id) AS ImageCount 
FROM Person 
LEFT OUTER JOIN ListMaster ON Person.LId = ListMaster.LId 
LEFT OUTER JOIN ListDetail ON ListDetail.LId = ListMaster.LId 
LEFT OUTER JOIN Data AS Image ON ListDetail.DataId = Image.Id 
GROUP BY Person.Id, 
     Person.Column1, 
     Person.Column2 
関連する問題