我正在尝试在Master表中为子表的一条记录编写存储过程
我有两张桌子。
我需要Property
的所有细节,只有一张图片。
在子表中,一个属性可能包含许多图像。
Property (propertyId, title)
propertyImage (imageId, FK_propertyId, imageFile)
E.g。
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)
答案 0 :(得分:2)
你的问题不是很清楚。我认为你需要的是Merge two tables(propery,propertyImage) into a single table (myProperty)
。这听起来像是一次性工作,为什么需要存储过程呢?以下查询可以完成这项工作。如果您需要存储过程语法,请check this MSDN link。另请注意,您的新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
答案 1 :(得分: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
答案 2 :(得分: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