2016-11-22 114 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」雖然有他以前張貼的圖片。

能否請你告訴我如何解決我的問題或告訴我,甚至在邏輯上可以做我想做的事情?我懷疑我的桌子設計有誤。

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 

我希望COUNT(Image.Id)AS ImageCount應該返回

2 
1 
0 
1 

但它返回

2 
1 
0 
0 

編輯1:更改表的設計

EDIT 2 :添加樣本數據

+2

'MyTable.LId' ?? –

+1

你的查詢看起來好,所以可能是數據問題。嘗試刪除'COUNT()'和'GROUP BY'並添加'DATA。*',以便在分組之前查看您的數據結果。 –

+0

@JuanCarlosOropeza我已經嘗試了SELECT * FROM Image,它顯示了正確的數據。但是當我嘗試使用COUNT()和GROUP BY時,「ImageCount」變爲「0」。 –

回答

1

它看起來像你的查詢和數據給出應返回你所期望的值。這是實際的模式,數據和查詢,還是你簡化來發布這篇文章?我假設你的真實數據不包含像「test 1 C1」等數值。你是否創建了一個帶有這些虛擬字段名稱和值的數據庫來做這個測試,或者你是否說這相當於你真正擁有的?如果這不是真正的東西,那很可能是因爲在簡化過程中遺漏了真正導致問題的東西。

當我有一個查詢不提供預期的結果時,我嘗試刪除部分查詢以查看問題出在哪裏。就像只嘗試第一次連接一樣,看看你是否能得到預期的結果。如果可行,請添加第二個連接等。退出GROUP BY並只轉儲所有記錄,以便您可以查看實際記錄,而不僅僅是計數。

有許多可能的麻煩來源。也許數據不是你想象的那樣。也許其中一個連接使用錯誤的字段。也許你遇到了麻煩,因爲你有不同的數據類型,並且轉換不能提供你期望的結果。等等

0

嘗試,如果像你說的,你Image.Id列聲明NOT NULL此檢查,如果所有的Id, Column1, Column2有圖像

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

,唯一的原因,你應該得到的0 COUNT(Image.Id)Person是,如果你的LEFT JOIN小號對於給定的Person,找不到任何Image。在這種情況下,Image.Id在您的基礎結果中將爲NULL,因此COUNT(Image.id)將爲零。這意味着要麼:

  • 有一個Person誰沒有任何ListMaster條目。
  • 有一個ListMaster它沒有任何ListDetail條目。
  • 有一個ListDetail條目沒有任何Data條目。

......或上述的某種組合。

你應該能夠快速檢查哪個環節缺少加入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