Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在sql中区分重复记录?_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 如何在sql中区分重复记录?

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

嗨,我有两张桌子,分别是ArtPlace和PhotoTable。我将场所存储在artPlace表中,并将其照片存储到photoTable,然后将场所Id作为ObjectId传递给photoTable。对于我为某个场所录制的任何图像,它都会添加具有相同ObjectId的记录。当我要检索艺术场所时,我只希望获得一条记录; 以下是我的代码示例和结果:

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不起作用我想在我的网站上显示照片也是。我不能删除它。在这种情况下,你没有任何副本,因为每张照片都是唯一的,对吗?你希望在这里实现什么?也许您正在寻找两个结果集,一个是位置,一个是照片?我只想要一个重复记录,但我们刚刚确定您没有任何重复记录,因为每个照片名称都是唯一的。您希望每个位置只返回一张照片吗?我也想在我的网站上显示照片。我无法删除它。在这种情况下,您没有任何副本,因为每张照片都是唯一的,对吗?您希望在这里实现什么?也许您正在寻找两个结果集,一个是位置,一个是照片?我只想要一个重复记录,但我们刚刚确定您没有任何重复记录,因为每个照片名称都是唯一的。您希望每个位置只返回一张照片吗?不,我只需要一条重复记录。在您的建议中,我只需要一条记录不,我只需要一条重复记录。在您的建议中,我只需要一条记录