2008-12-16 68 views
0

MSSQL有一个疑问。 数据库中有两个表。查询链接两个表的SQL查询

表1命名属性包含 字段PRPT_Id(INT),PRPT_Name(VARCHAR),PRPT_Status(位)

表2命名PropertyImages包含字段PIMG_Id(INT),PIMG_ImageName(VARCHAR),PRPT_Id(INT), PIMG_Status(位)

这两个表遵循一对多的关系。 这意味着每个Property可以有零个,一个或多个PropertyImages对应它。

所需要的是,以显示

PRPT_Id,PRPT_Name,ImageCount,FirstImageName(如果有N个图像(对应于PRPT_Id其中PIMG_Status是真实的。o如果存在的arent任何图片的所有图像的计数)的查询,图像表中第一个图像的名称对应于PIMG_Status为true的PRPT_Id,如果没有任何图像,我们用空格/空白填充)。另一个条件是PRPT_Status应该是true。

编辑注 - 两个表都有自动增量整数作为主键。 因此,第一个图像名称将与MIN(PIMG_Id)的名称,是不是这样?

我想对应MIN(PIMG_ID)在结果

+0

什么是“第一”图像?带有最小PIMG_Id的图像? – 2008-12-16 06:29:55

+0

你只是表中第一个图像。但它也会有最小的PIMG_Id,因为PIMG_Id是自动递增的 – naveen 2008-12-16 06:33:30

回答

2

假设FirstImage指具有最低ID,则此应至少足够接近测试完成:

SELECT
PRPT_Id,
PRPT_Name,
ISNULL(pi1.ImageName , '')AS FirstImageName,
COUNT(1)AS ImageCount

FROM属性为p

LEFT JOIN PropertyImages AS PI
ON p.PRPT_Id = pi.PRPT_Id

LEFT JOIN PropertyImage AS PI1
ON p.PRPT_Id = pi1.PRPT_Id

LEFT JOIN PropertyImgage AS PI2
在页码。 PRPT_Id = pi2.PRPT_Id
AND pi1.PIMG_Id> pi2.PIMG_Id

WHERE PRPT_Status = TRUE
AND pi1.PIMG_Status = TRUE
AND pi2.PIMG_ImageName IS NULL

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

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

2

的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) 

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

问候,


编辑:

SELECT Properties.*, 
     PRPT_ImageCount, 
     PRPT_MinImage, 
     PIMG_ImageName 
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) Temp1 
     ON (Properties.PRPT_Id = Temp1.PRPT_Id)) Temp2 LEFT JOIN 
    PropertyImages ON (PropertyImages.PIMG_Id = Temp2.PRPT_MinImage) 

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

0

在图像表中对应PRPT_Id与PIMG_Status您可能希望在这方面界定“第一”的第一形象真实

的名称。表格并非真正的排序,除非你自己订购,否则这个术语首先需要表示“找到第一个”。

假设上述情况属实(您希望首先发现图像),那么这是查询中唯一真正困难的部分(以及之前绊住我的事物的类型)。其余的部分看起来相当简单。如果我明天可以找到时间,我会尽量为你安排一些东西......但似乎有人可以在那之前提供答案。