Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 从该查询中获取不重复的行,而不使用distinct关键字_Sql Server - Fatal编程技术网

Sql server 从该查询中获取不重复的行,而不使用distinct关键字

Sql server 从该查询中获取不重复的行,而不使用distinct关键字,sql-server,Sql Server,我需要在不使用distinct关键字的情况下从下面的查询中筛选出不同的行 因此,在CM.PfmFolderMstIpMap表中存在重复的F.Id或PMMAP.PfmFolderFK Id,因此我想过滤掉不重复的 SELECT F.Id, F.folderno, F.folderstatusdate, (SELECT codedesc

我需要在不使用distinct关键字的情况下从下面的查询中筛选出不同的行

因此,在CM.PfmFolderMstIpMap表中存在重复的F.Id或PMMAP.PfmFolderFK Id,因此我想过滤掉不重复的

    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就是用来处理这种负载的-