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
答案 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 ImageCountFROM Property AS p
LEFT JOIN PropertyImages AS pi
ON p.PRPT_Id = pi.PRPT_IdLEFT JOIN PropertyImage AS pi1
ON p.PRPT_Id = pi1.PRPT_IdLEFT JOIN PropertyImgage AS pi2
ON p.PRPT_Id = pi2.PRPT_Id
AND pi1.PIMG_Id> pi2.PIMG_IdWHPT 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”。表格并没有真正订购,除非您保留自己的订单,否则首先需要表示“找到第一个”。
假设上面的描述是真的(你想要找到第一个找到的图像),那么这是查询中唯一真正困难的部分(以及之前绊倒我的事物的类型)。其余部分似乎相当直接。如果我能找到明天的时间,我会尝试为你准备一些东西......但似乎其他人可能会在此之前提供答案。