链接两个表的Sql查询

链接两个表的Sql查询,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,MSSQL中的一个疑问。 数据库中有两个表 表1命名属性包含 字段PRPT_Id(int)、PRPT_名称(varchar)、PRPT_状态(bit) 表2命名属性图像包含PIMG_Id(int)、PIMG_图像名称(varchar)、PRPT_Id(int)、PIMG_状态(bit)字段 这两个表遵循一对多关系。 这意味着每个属性可以有零个、一个或多个对应于它的PropertyImage 所需的是要显示的查询 PRPT_Id、PRPT_名称、ImageCount(与PIMG_状态为true的P

MSSQL中的一个疑问。 数据库中有两个表

表1命名属性包含 字段PRPT_Id(int)、PRPT_名称(varchar)、PRPT_状态(bit)

表2命名属性图像包含PIMG_Id(int)、PIMG_图像名称(varchar)、PRPT_Id(int)、PIMG_状态(bit)字段

这两个表遵循一对多关系。 这意味着每个属性可以有零个、一个或多个对应于它的PropertyImage

所需的是要显示的查询

PRPT_Id、PRPT_名称、ImageCount(与PIMG_状态为true的PRPT_Id对应的所有图像计数。如果没有任何图像,则为o)、FIRSTMAGENAME(如果有n个图像,则为图像表中与PIMG_状态为true的PRPT_Id对应的第一个图像的名称。如果没有任何图像,则用空格/空白填充)。另一个条件是PRPT_状态应为真

编辑说明-这两个表都将自动递增的整数作为主键。 所以第一个图像名将是带有MIN(PIMG_Id)的名称,不是吗


我需要与结果集中的MIN(PIMG_ID)对应的PIMG_ImageName。似乎您必须编写嵌套查询来显示所需内容

如果是这样的话(我不是SQL专家),我建议您从最里面的查询开始,然后再执行,直到到达最外面(也是最后一个)的查询

首先,您必须检索PIMG并按PRPT将其分组

SELECT PRPT_Id, COUNT(PIMG_Id) AS PRPT_ImageCount, MIN(PIMG_Id) AS PRPT_MinImage
FROM PropertyImages
GROUP BY PRPT_Id
检索具有关联图像的属性的PRPT_Id。但是,对于没有任何关联图像的属性,您不会得到任何结果

SELECT Properties.*, PRPT_ImageCount, PRPT_MinImage
FROM Properties LEFT JOIN (
SELECT PRPT_Id, COUNT(PIMG_Id) AS PRPT_ImageCount, MIN(PIMG_Id) AS PRPT_MinImage
FROM PropertyImages
GROUP BY PRPT_Id ) Temp ON ( Properties.PRPT_Id = Temp.PRPT_Id )
之后,我们将把Properties表与前面的查询左键联接。左连接确保检索所有属性,即使它们没有出现在右查询的结果中(也就是说,即使它们没有任何关联的图像)

我希望我的SQL没有错,希望这篇文章能帮助你

问候,


编辑:


现在,我真的不确定我的SQL。

似乎必须编写嵌套查询来显示所需内容

如果是这样的话(我不是SQL专家),我建议您从最里面的查询开始,然后再执行,直到到达最外面(也是最后一个)的查询

首先,您必须检索PIMG并按PRPT将其分组

SELECT PRPT_Id, COUNT(PIMG_Id) AS PRPT_ImageCount, MIN(PIMG_Id) AS PRPT_MinImage
FROM PropertyImages
GROUP BY PRPT_Id
检索具有关联图像的属性的PRPT_Id。但是,对于没有任何关联图像的属性,您不会得到任何结果

SELECT Properties.*, PRPT_ImageCount, PRPT_MinImage
FROM Properties LEFT JOIN (
SELECT PRPT_Id, COUNT(PIMG_Id) AS PRPT_ImageCount, MIN(PIMG_Id) AS PRPT_MinImage
FROM PropertyImages
GROUP BY PRPT_Id ) Temp ON ( Properties.PRPT_Id = Temp.PRPT_Id )
之后,我们将把Properties表与前面的查询左键联接。左连接确保检索所有属性,即使它们没有出现在右查询的结果中(也就是说,即使它们没有任何关联的图像)

我希望我的SQL没有错,希望这篇文章能帮助你

问候,


编辑:

现在,我真的不确定我的SQL

与PIMG_状态为true的PRPT_Id对应的图像表中第一个图像的名称

您可能希望在此上下文中定义“第一”。表并不是真的按顺序排列的,除非您保持自己的顺序,否则术语first需要表示“找到的第一个”

假设以上是真的(您想要第一个找到的图像),那么这是查询中唯一真正困难的部分(以及之前让我绊倒的类型)。其余部分似乎相当直截了当。如果明天我能抽出时间,我会尽力为你准备一些东西。。。但在那之前,似乎有其他人能够提供答案

与PIMG_状态为true的PRPT_Id对应的图像表中第一个图像的名称

您可能希望在此上下文中定义“第一”。表并不是真的按顺序排列的,除非您保持自己的顺序,否则术语first需要表示“找到的第一个”


假设以上是真的(您想要第一个找到的图像),那么这是查询中唯一真正困难的部分(以及之前让我绊倒的类型)。其余部分似乎相当直截了当。如果明天我能抽出时间,我会尽力为你准备一些东西。。。但在此之前,似乎有其他人能够提供答案。

假设FirstImage是指Id最低的图像,则此图像至少应足够接近测试完成:

选择
PRPT_Id,
PRPT_名称,
作为FirstImageName,
计数(1)为ImageCount

从属性作为p

左连接属性图像为pi
在p.PRPT_Id=pi.PRPT_Id上

左连接属性图像为pi1
在p.PRPT_Id=pi1.PRPT_Id上

左连接属性管理为pi2
在p.PRPT_Id=pi2.PRPT_Id上
和pi1.PIMG_Id>pi2.PIMG_Id

其中PRPT_Status=TRUE
和pi1.PIMG_Status=TRUE
pi2.PIMG_ImageName为空

双左连接确保您获得pi1中的第一个图像记录。如果“第一个”规则不同,则相应地调整此联接


这应该是尽可能有效的。它没有子查询。

假设FirstImage表示Id最低的子查询,则该子查询至少应足够接近,以便测试完成:

选择
PRPT_Id,
PRPT_名称,
作为FirstImageName,
计数(1)为ImageCount

从属性作为p

左连接属性图像为pi
在p.PRPT_Id=pi.PRPT_Id上

左连接属性图像为pi1
在p.PRPT_Id=pi1.PRPT_Id上

左连接属性管理为pi2
在p.PRPT_Id=pi2.PRPT_Id上
和pi1.PIMG_Id>pi2.PIMG_Id

其中PRPT_Status=TRUE
和pi1.PIMG_Status=TRUE
pi2.PIMG_ImageName为空

双左连接确保您获得pi1中的第一个图像记录。如果