1

我正在尝试为主表中的子表的一条记录编写存储过程

我有两张桌子。

  • 大师“财产”
  • 孩子“PropertyImage”

Property我只需要一张图片的所有细节。

在子表中,一个属性可能有许多图像。

Property (propertyId, title)

propertyImage (imageId, FK_propertyId, imageFile)

例如

property (1, smallbuilding)
property (2, largebuilding)

propertyImage(1, 1, 1.jpg)
propertyImage(2, 1, 2.jpg)
propertyImage(3, 1, 3.jpg)
propertyImage(4, 1, 4.jpg)
propertyImage(5, 2, 7.jpg)
propertyImage(6, 2, 8.jpg)

我的要求是:

MyProperty(propertyId, title, imageFile)
Myproperty(1, smallbuilding, 1.jpg)
Myproperty(2, bigbuilding, 2.jpg)
4

3 回答 3

2

你的问题不是很清楚。我认为你需要的是Merge two tables(propery,propertyImage) into a single table (myProperty). 这听起来像是一次性工作,那么为什么需要存储过程呢?以下查询可以完成这项工作。如果需要,请查看此 MSDN 链接以获取存储过程语法。另请注意,您的新 MyProperty 表应该有一个主键列。

INSERT INTO MyProperty (propertyId,title,imageFile)
SELECT propertyId, title, imageFile FROM (
    SELECT p.propertyId,p.title,i.imageFile, 
           RANK() OVER (ORDER BY i.FK_propertyId, i.ImageId) RN
    FROM Property p JOIN propertyImage i 
     ON p.propertyId = i.FK_propertyId
) A
WHERE RN = 1
于 2012-12-17T10:05:32.067 回答
1

听起来你需要这个

;WITH cte AS
 (
  SELECT ROW_NUMBER() OVER (PARTITION BY propertyId ORDER BY imageId) AS rn,
         propertyId, title, imageFile
  FROM Property p JOIN propertyImage pr ON p.propertyId = pr.FK_propertyId
  )
  SELECT propertyId, title, imageFile
  FROM cte
  WHERE rn = 1
于 2012-12-17T23:48:32.417 回答
0

根据您选择的方式propertyImage,您可以为 CTE 中的每个属性选择一个并加入:

WITH FirstImagePerProperty
AS
(
    SELECT FK_propertyId,
           MIN(imageId) As FirstImageId
    FROM PropertyImage
    GROUP BY FK_propertyId
)
SELECT
   p.propertyId,
   p.title,
   i.imageId, 
   i.imageFile
FROM Property p
INNER JOIN FirstImagePerProperty fipp ON p.propertyId=fipp.FK_propertyId
INNER JOIN PropertyImage i ON fipp.FK_propertyId=i.FK_propertyId
于 2012-12-17T10:17:07.120 回答