Sql server 从该查询中获取不重复的行,而不使用distinct关键字
我需要在不使用distinct关键字的情况下从下面的查询中筛选出不同的行 因此,在CM.PfmFolderMstIpMap表中存在重复的F.Id或PMMAP.PfmFolderFK Id,因此我想过滤掉不重复的Sql server 从该查询中获取不重复的行,而不使用distinct关键字,sql-server,Sql Server,我需要在不使用distinct关键字的情况下从下面的查询中筛选出不同的行 因此,在CM.PfmFolderMstIpMap表中存在重复的F.Id或PMMAP.PfmFolderFK Id,因此我想过滤掉不重复的 SELECT F.Id, F.folderno, F.folderstatusdate, (SELECT codedesc
SELECT F.Id,
F.folderno,
F.folderstatusdate,
(SELECT codedesc
FROM cm.codetable
WHERE id = F.FolderStatusCode) 'FolderStatus',
(SELECT codedesc
FROM cm.codetable
WHERE id = F.FolderLocationCode) 'Location',
F.volume,
F.sdexhibits,
F.cost,
F.remarks
FROM cm.pfmfolder F WITH(nolock)
INNER JOIN cm.pfmfoldermstipmap PMMAP WITH(nolock)
ON PMMAP.pfmfolderfk = F.id
INNER JOIN cm.mstip MST WITH(nolock)
ON MST.id = PMMAP.mstipfk
LEFT JOIN tm.mstirsdmstipmap IRMAP WITH(nolock)
ON IRMAP.mstipfk = MST.id
LEFT JOIN tm.mstirsd IRSD WITH(nolock)
ON IRSD.id = IRMAP.mstirsdfk
LEFT JOIN tm.mstir IR WITH(nolock)
ON IR.id = IRSD.mstirfk
LEFT JOIN tm.mstiabasicmark IABM
ON IABM.basicmarknbr = MST.applnnbr
LEFT JOIN tm.mstia IA
ON IA.id = IABM.mstiafk
WHERE ( @FolderNbr IS NULL
OR F.folderno LIKE + @FolderNbr + '%' )
AND ( @ApplnNbr IS NULL
OR MST.applnnbr LIKE + @ApplnNbr + '%' )
AND ( @IrNbr IS NULL
OR IR.irnbr LIKE + @IrNbr + '%' )
AND ( @IaNbr IS NULL
OR IA.ianbr LIKE + @IaNbr + '%' )
AND ( @FolderStatusCode IS NULL
OR F.folderstatuscode = @FolderStatusCode )
AND ( @FolderLocationCode IS NULL
OR F.folderlocationcode = @FolderLocationCode )
AND ( F.folderstatusdate >= @FolderStatusDateFrom
AND F.folderstatusdate < @FolderStatusDateTo )
AND MST.registrycode = @RegistryCode
AND PMMAP.deletedby IS NULL
Distinct是最好的选择。否则,通过使用所有列来使用Group,正如Sam所说,Distinct是最好的选择。否则,请通过使用所有列来使用Group 您也可以使用行数功能 试试这个
SELECT * FROM
(
SELECT F.Id,
F.folderno,
F.folderstatusdate,
(SELECT codedesc
FROM cm.codetable
WHERE id = F.FolderStatusCode) 'FolderStatus',
(SELECT codedesc
FROM cm.codetable
WHERE id = F.FolderLocationCode) 'Location',
F.volume,
F.sdexhibits,
F.cost,
F.remarks,
Row_number() OVER(partition BY F.Id ORDER BY (SELECT NULL) ASC) RN
FROM cm.pfmfolder F WITH(nolock)
INNER JOIN cm.pfmfoldermstipmap PMMAP WITH(nolock)
ON PMMAP.pfmfolderfk = F.id
INNER JOIN cm.mstip MST WITH(nolock)
ON MST.id = PMMAP.mstipfk
LEFT JOIN tm.mstirsdmstipmap IRMAP WITH(nolock)
ON IRMAP.mstipfk = MST.id
LEFT JOIN tm.mstirsd IRSD WITH(nolock)
ON IRSD.id = IRMAP.mstirsdfk
LEFT JOIN tm.mstir IR WITH(nolock)
ON IR.id = IRSD.mstirfk
LEFT JOIN tm.mstiabasicmark IABM
ON IABM.basicmarknbr = MST.applnnbr
LEFT JOIN tm.mstia IA
ON IA.id = IABM.mstiafk
WHERE ( @FolderNbr IS NULL
OR F.folderno LIKE + @FolderNbr + '%' )
AND ( @ApplnNbr IS NULL
OR MST.applnnbr LIKE + @ApplnNbr + '%' )
AND ( @IrNbr IS NULL
OR IR.irnbr LIKE + @IrNbr + '%' )
AND ( @IaNbr IS NULL
OR IA.ianbr LIKE + @IaNbr + '%' )
AND ( @FolderStatusCode IS NULL
OR F.folderstatuscode = @FolderStatusCode )
AND ( @FolderLocationCode IS NULL
OR F.folderlocationcode = @FolderLocationCode )
AND ( F.folderstatusdate >= @FolderStatusDateFrom
AND F.folderstatusdate < @FolderStatusDateTo )
AND MST.registrycode = @RegistryCode
AND PMMAP.deletedby IS NULL
) AS T
WHERE RN = 1
您不想使用distinct的原因是什么?如果我使用distinct,会导致性能降低,因为有将近300K的记录。我只选择了一些列,无法使用GroupBy我的意思是使用您正在选择的列来分组By我尝试过但需要11秒来执行400K记录…有没有其他更快的方法来解决此问题您检查了执行计划吗?你的连接太多了。将它们分解为子查询。并且,尝试获取这些子查询中的唯一记录。从执行计划开始。祝你一切顺利!不要担心记录的数量。DBMS就是用来处理这种负载的-