我使用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)上应用的关键字?在这种情况下我们可以使用临时表吗? 我无法删除那些给我带来问题的无聊线。
你有想法解决它吗?
答案 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