如何在select请求中对行进行排序,使其不具有多个相同的行

时间:2014-12-30 13:22:07

标签: sql sql-server sql-server-2008

我使用SQL Server 2008并尝试执行包含select请求的存储过程。 我有一个参数变量,目的是select resquest返回好的数据。但是,我得到的几行是相同的,我无法摆脱我的这些行 选择请求。 我用3个表: 表1,表2,表3和我尝试做这个resquest:

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的倍数线。 字段Image可能会更改为具有相同Id的每个ligne。所有cas中的大部分都是相同的。(我没有把每个表的所有元素都放在我的选择中) 我的目标是获得几个tb3.id每个不同(这就是为什么我尝试使用DISTINCT) 我也尝试将COUNT(*) AS ServeralLines放入我的选择和GROUP BY tb3.Id,tb2.Nom,tb1.MonIdPrecis,tb3.Titre,tb1.Rang,tb3.Image但是它不适用于每一行。

有可能或者是否存在像DISTINCT这样仅在一个字段(tb3.Id)上应用的关键字?在这种情况下我们可以使用临时表吗? 我无法删除那些给我带来问题的无聊线。

你有想法解决它吗?

1 个答案:

答案 0 :(得分:1)

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

没有“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