Sql 我正在尝试将两个表(主表和子表)合并为一个表。我只需要存储过程中子表的一条记录
我试图为主表中的子表的一条记录编写一个存储过程 我有两张桌子Sql 我正在尝试将两个表(主表和子表)合并为一个表。我只需要存储过程中子表的一条记录,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,我试图为主表中的子表的一条记录编写一个存储过程 我有两张桌子 主“财产” 子“属性图像” 我需要属性的所有详细信息只有一张图像 在子表中,一个属性可能有多个图像 Property (propertyId, title) propertyImage (imageId, FK_propertyId, imageFile) 例如 我的要求是: MyProperty(propertyId, title, imageFile) Myproperty(1, smallbuilding, 1.jpg)
- 主“财产”
- 子“属性图像”
属性的所有详细信息
只有一张图像
在子表中,一个属性可能有多个图像
Property (propertyId, title)
propertyImage (imageId, FK_propertyId, imageFile)
例如
我的要求是:
MyProperty(propertyId, title, imageFile)
Myproperty(1, smallbuilding, 1.jpg)
Myproperty(2, bigbuilding, 2.jpg)
你的问题不是很清楚。我认为您需要的是
将两个表(property,propertyImage)合并到一个表(myProperty)
。这听起来像是一次性的工作,那么为什么需要存储过程呢?下面的查询可以完成这项工作。如果需要存储过程语法,请提供存储过程语法。还请注意,新的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
根据您希望如何选择一个
属性图像
,您可以为每个属性选择一个CTE并加入该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
听起来你需要这个
;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
您希望如何选择一个
属性图像
——第一个由图像ID
选择?或者其他什么?您的预期结果也没有意义-属性2
与图像2.jpg
-第一个关联的是7.jpg
@PavanVParekh更新为RANK()
以获得基于i.FK\u propertyId,i.ImageId
的前1
,谢谢@Alexander Fedorenko
;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