我想把两个表(Master和child)合二为一。我只需要存储过程中的一个子表记录

时间:2012-12-17 09:40:25

标签: sql sql-server sql-server-2008 stored-procedures

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

我有两张桌子。

  • Master“Property”
  • 儿童“PropertyImage”

我需要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)

3 个答案:

答案 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