如何在选择检索中对行进行排序,使其没有多个相同的行



我使用 SQL Server 2008,并尝试执行一个包含选择请求的存储过程。我在参数中有一个变量,目的是选择重新任务返回良好的数据。但是,我得到几行相同的行,我无法摆脱这些行选择"请求"。我使用3张桌子:表1,表2,表3,我尝试进行此重新访问:

ALTER PROCEDURE [dbo].[bkd_GetContent]
    @MonIdPrecis int
AS
BEGIN

SET NOCOUNT ON;
SELECT DISTINCT tb3.Id,tb2.Nom,tb1.MonIdPrecis,tb3.Titre,tb1.Rang,tb3.Image
FROM  dbo.Table1 tb1
LEFT JOIN dbo.Table2 tb2 ON tb2.Id = tb1.MonIdPrecis 
LEFT JOIN dbo.Table3 tb3 ON tb3.Id = tb1.Id
WHERE tb1.MonIdPrecis = @MonIdPrecis  
     AND tb2.Activtb2ed = 1 
     AND tb3.Id IS NOT NULL 
ORDER BY tb1.Rang
END

但是我得到具有相同 tb3 的多行。与这个重新任务的ID一样。字段图像可能会更改为具有相同 ID 的每个法谱。大多数 cas 所有的线都是相同的。(我没有把每个表的所有元素都放在我的选择中)我的目标是得到几个不同的 tb3.id(这就是我尝试使用DISTINCT的原因)我也尝试将COUNT(*) AS ServeralLines放入我的选择和GROUP BY tb3.Id,tb2.Nom,tb1.MonIdPrecis,tb3.Titre,tb1.Rang,tb3.Image中,但它不适用于每行。

有可能或是否存在像 DISTINCT 这样的关键字,它仅适用于一个字段 (tb3.同上) ?在这种情况下,我们可以使用临时表吗?我无法删除给我带来问题的无聊台词。

你有想法来修复它吗?

如评论中所述,您需要确保使用正确的键加入。如果不确切知道您的数据模型是什么样子的,就很难回答这个问题。

没有"仅适用于一个字段的 DISTINCT"这样的东西。这甚至没有意义,因为您没有"应用"您的 DISTINCT 的列上的输出是什么?

但是,您可以做的是使用 ROW_NUMBER 函数为每个只想从中返回 1 条记录的数据"块"分配一个运行值。在您的情况下,我想类似以下内容的方法可能会起作用:

SELECT Id,Nom,MonIdPrecis,Titre,Rang,Image
FROM (
    SELECT tb3.Id,tb2.Nom,tb1.MonIdPrecis,tb3.Titre,tb1.Rang,tb3.Image,
        ROW_NUMBER() OVER (PARTITION BY tb3.Id ORDER BY tb1.Rang) AS RunningValue
    FROM  dbo.Table1 tb1
    LEFT JOIN dbo.Table2 tb2 ON tb2.Id = tb1.MonIdPrecis 
    LEFT JOIN dbo.Table3 tb3 ON tb3.Id = tb1.Id
    WHERE tb1.MonIdPrecis = @MonIdPrecis  
        AND tb2.Activtb2ed = 1 
        AND tb3.Id IS NOT NULL 
) AS T
WHERE RunningValue = 1
ORDER BY tb1.Rang

最新更新