Sql查询链接两个表

时间:2008-12-16 06:20:31

标签: sql sql-server sql-server-2005

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

表1命名属性包含 字段PRPT_Id(int),PRPT_Name(varchar),PRPT_Status(bit)

表2命名的PropertyImages包含字段PIMG_Id(int),PIMG_ImageName(varchar),PRPT_Id(int),PIMG_Status(bit)

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

所需要的是要显示的查询

PRPT_Id,PRPT_Name,ImageCount(对应于PRPT_Id的所有图像的计数,其中PIMG_Status为真。如果没有任何图像,则为o),FirstImageName(如果有n个图像,则图像表中第一个图像的名称对应于PRPT_Id与PIMG_Status为真。如果没有任何图像,我们用空白/空白填充它。另一个条件是PRPT_Status应该是真的。

编辑注 - 两个表都具有自动增量整数作为主键。 那么第一个Image名称将是MIN(PIMG_Id)的名称,不是这样吗?

我想在结果集中对应于MIN(PIMG_ID)的PIMG_ImageName

3 个答案:

答案 0 :(得分:2)

您似乎必须编写嵌套查询才能显示所需内容。

如果是这种情况(我不是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。但是,对于没有任何关联图像的属性,您不会得到任何结果。

之后,我们将继续使用上一个查询加入Properties表。左连接确保将检索所有属性,即使它们没有出现在正确查询的结果中(即,即使它们没有任何关联的图像)。

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。

答案 1 :(得分:2)

假设FirstImage意味着具有最低Id的那个,那么这应该至少足够接近以测试完成:

  

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

     

FROM Property AS 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
     ON p.PRPT_Id = pi2.PRPT_Id
     AND pi1.PIMG_Id> pi2.PIMG_Id

     

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

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

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

答案 2 :(得分:0)

  

图像表中与PRPT_Id对应的第一个图像的名称,其中PIMG_Status为真

您可能希望在此上下文中定义“first”。表格并没有真正订购,除​​非您保留自己的订单,否则首先需要表示“找到第一个”。

假设上面的描述是真的(你想要找到第一个找到的图像),那么这是查询中唯一真正困难的部分(以及之前绊倒我的事物的类型)。其余部分似乎相当直接。如果我能找到明天的时间,我会尝试为你准备一些东西......但似乎其他人可能会在此之前提供答案。