要求:我想知道每个人发布了多少张图片。
因此,我创建了一个表模式,如下所示。
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:更改表格设计
编辑2:添加样本数据
答案 0 :(得分:2)
如果您说Image.Id
列已宣布为NOT NULL
,那么COUNT(Image.Id)
Person
为LEFT JOIN
的唯一原因就是{ {1}}找不到给定Image
的任何Person
。在这种情况下,基础结果中的Image.Id
将为NULL
,因此COUNT(Image.id)
将为零。这意味着:
Person
没有任何ListMaster
条目。ListMaster
没有任何ListDetail
条目。ListDetail
条目,没有任何Data
条目。......或上述的某种组合。
您应该能够通过将适当的表的COUNT
添加到现有查询来快速检查哪些链接丢失了:
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
答案 1 :(得分:1)
看起来您的查询和数据应该返回您期望的值。这是实际的架构,数据和查询,还是您正在简化这篇文章?我假设您的实际数据不包括"测试1 C1和#34;等等。您是否创建了具有这些虚拟字段名称和值的数据库来进行此测试,或者您是说这相当于你真的拥有什么?如果这不是实际的东西,很可能是因为在简化中你遗漏了导致问题的原因。
如果我的查询没有给出预期的结果,我会尝试删除部分查询以查看问题所在。就像只尝试第一次加入一样,看看你是否得到了预期的结果。如果可行,请添加第二个连接等。省略GROUP BY并只转储所有记录,这样您就可以看到实际记录而不仅仅是计数。
有许多可能的麻烦来源。也许这些数据并不是您的想法。也许其中一个连接使用了错误的字段。也许您遇到了麻烦,因为您有不同的数据类型,并且转换无法提供您期望的结果。等
答案 2 :(得分:0)
尝试此操作以检查您的所有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