Sql server 如何在sql中区分重复记录?
嗨,我有两张桌子,分别是ArtPlace和PhotoTable。我将场所存储在artPlace表中,并将其照片存储到photoTable,然后将场所Id作为ObjectId传递给photoTable。对于我为某个场所录制的任何图像,它都会添加具有相同ObjectId的记录。当我要检索艺术场所时,我只希望获得一条记录; 以下是我的代码示例和结果:Sql server 如何在sql中区分重复记录?,sql-server,stored-procedures,Sql Server,Stored Procedures,嗨,我有两张桌子,分别是ArtPlace和PhotoTable。我将场所存储在artPlace表中,并将其照片存储到photoTable,然后将场所Id作为ObjectId传递给photoTable。对于我为某个场所录制的任何图像,它都会添加具有相同ObjectId的记录。当我要检索艺术场所时,我只希望获得一条记录; 以下是我的代码示例和结果: SELECT ArtPlace.Id , PhotoTable.ObjectId, ArtPlace.ArtPlaceNam
SELECT ArtPlace.Id ,
PhotoTable.ObjectId,
ArtPlace.ArtPlaceName,
ArtPlace.Address,
ArtPlace.Title,
ArtPlace.Summary,
ArtPlace.Description,
ArtPlace.Visitor,
ArtPlace.Website,
PhotoTable.PhotoName
FROM ArtPlace
INNER JOIN City ON ArtPlace.CityId = City.Id
INNER JOIN PhotoTable ON( dbo.PhotoTable.ObjectId = dbo.ArtPlace.Id and dbo.PhotoTable.CategoryId = 5 )
WHERE ArtPlace.CityId = @CityId AND
dbo.ArtPlace.IsActive = 1 AND
dbo.PhotoTable.CategoryId = 5
END;
唯一的区别在于photoName colunm我认为这里的问题是与PhotoTable的连接,因为对于该位置的每个图片,它都返回带有位置细节的行。我的建议是用EXISTS子句替换join,并从结果集中删除PhotoTable.PhotoName和PhotoTable.ObjectId。这样,您只查看位置,而不查看任何照片细节
SELECT ArtPlace.Id ,
ArtPlace.ArtPlaceName,
ArtPlace.Address,
ArtPlace.Title,
ArtPlace.Summary,
ArtPlace.Description,
ArtPlace.Visitor,
ArtPlace.Website
FROM ArtPlace
INNER JOIN City ON ArtPlace.CityId = City.Id
WHERE ArtPlace.CityId = @CityId
AND dbo.ArtPlace.IsActive = 1
AND EXISTS(SELECT 1 FROM PhotoTable WHERE dbo.PhotoTable.ObjectId = dbo.ArtPlace.Id and dbo.PhotoTable.CategoryId = 5 )
此外,我还建议删除CategoryId=5的硬编码,如果不能将其作为纯参数,则将其设置为带有默认值的参数。我认为这里的问题是与PhotoTable的连接,因为对于该位置的每个图片,它返回带有位置详细信息的行。我的建议是用EXISTS子句替换join,并从结果集中删除PhotoTable.PhotoName和PhotoTable.ObjectId。这样,您只查看位置,而不查看任何照片细节
SELECT ArtPlace.Id ,
ArtPlace.ArtPlaceName,
ArtPlace.Address,
ArtPlace.Title,
ArtPlace.Summary,
ArtPlace.Description,
ArtPlace.Visitor,
ArtPlace.Website
FROM ArtPlace
INNER JOIN City ON ArtPlace.CityId = City.Id
WHERE ArtPlace.CityId = @CityId
AND dbo.ArtPlace.IsActive = 1
AND EXISTS(SELECT 1 FROM PhotoTable WHERE dbo.PhotoTable.ObjectId = dbo.ArtPlace.Id and dbo.PhotoTable.CategoryId = 5 )
此外,我建议删除CategoryId=5的硬编码,如果无法将其作为纯参数,则将其设置为带有默认值的参数。您可以通过查询获得正确的结果,但如果您只需要一条记录,则可以使用行号
;WITH CTE AS (
SELECT
ROW_NUMBER() OVER(PARTITION BY ArtPlace.Id ORDER BY ArtPlace.Id) RN,
ArtPlace.Id ,
PhotoTable.ObjectId,
ArtPlace.ArtPlaceName,
ArtPlace.Address,
ArtPlace.Title,
ArtPlace.Summary,
ArtPlace.Description,
ArtPlace.Visitor,
ArtPlace.Website,
PhotoTable.PhotoName
FROM ArtPlace
INNER JOIN City ON ArtPlace.CityId = City.Id
INNER JOIN PhotoTable ON dbo.PhotoTable.ObjectId = dbo.ArtPlace.Id
WHERE ArtPlace.CityId = @CityId AND
dbo.ArtPlace.IsActive = 1 AND
dbo.PhotoTable.CategoryId = 5
)
SELECT *
FROM CTE
WHERE RN=1
查询结果正确,但如果只需要一条记录,则可以使用行号
;WITH CTE AS (
SELECT
ROW_NUMBER() OVER(PARTITION BY ArtPlace.Id ORDER BY ArtPlace.Id) RN,
ArtPlace.Id ,
PhotoTable.ObjectId,
ArtPlace.ArtPlaceName,
ArtPlace.Address,
ArtPlace.Title,
ArtPlace.Summary,
ArtPlace.Description,
ArtPlace.Visitor,
ArtPlace.Website,
PhotoTable.PhotoName
FROM ArtPlace
INNER JOIN City ON ArtPlace.CityId = City.Id
INNER JOIN PhotoTable ON dbo.PhotoTable.ObjectId = dbo.ArtPlace.Id
WHERE ArtPlace.CityId = @CityId AND
dbo.ArtPlace.IsActive = 1 AND
dbo.PhotoTable.CategoryId = 5
)
SELECT *
FROM CTE
WHERE RN=1
结果在哪里?请点击链接不能真正从图像中分辨出来,但你不是仅仅在
选择DISTINCT
后才工作吗?DISTINCT不起作用结果在哪里?请点击链接不能真正从图像中分辨出来,但你不是仅仅在选择DISTINCT
后工作吗?DISTINCT不起作用我想在我的网站上显示照片也是。我不能删除它。在这种情况下,你没有任何副本,因为每张照片都是唯一的,对吗?你希望在这里实现什么?也许您正在寻找两个结果集,一个是位置,一个是照片?我只想要一个重复记录,但我们刚刚确定您没有任何重复记录,因为每个照片名称都是唯一的。您希望每个位置只返回一张照片吗?我也想在我的网站上显示照片。我无法删除它。在这种情况下,您没有任何副本,因为每张照片都是唯一的,对吗?您希望在这里实现什么?也许您正在寻找两个结果集,一个是位置,一个是照片?我只想要一个重复记录,但我们刚刚确定您没有任何重复记录,因为每个照片名称都是唯一的。您希望每个位置只返回一张照片吗?不,我只需要一条重复记录。在您的建议中,我只需要一条记录不,我只需要一条重复记录。在您的建议中,我只需要一条记录