2014-12-30 45 views
0

我使用SQL Server 2008,並嘗試執行包含select請求的存儲過程。 我有一個參數的變量,目的是選擇resquest返回好數據。然而,我得到幾條線是相同的,我不能擺脫我的 選擇請求中的這些行。 我用3個表:表1 ,表2,表3和我嘗試這樣做resquest:如何在select select 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 

,但我得到與此resquest相同tb3.Id倍數線。 字段圖像可能會更改爲具有相同標識的每個ligne。大多數cas的所有行都是相同的(我沒有把每個表中的所有元素都放在我的select中) 我的目標是獲得幾個不同的tb3.id(這就是爲什麼我嘗試使用DISTINCT) 也試着把COUNT(*) AS ServeralLines放在我的select和GROUP BY tb3.Id,tb2.Nom,tb1.MonIdPrecis,tb3.Titre,tb1.Rang,tb3.Image中,但它不適用於每一行。

它是可能的還是存在一個像DISTINCT這樣的關鍵字只適用於一個字段(tb3.Id)?使用tempory表在這種情況下? 我不能刪除無聊的線,給我一個問題。

你有一個想法解決它?

+0

首先,檢查您是否使用正確的連接鍵。 – dario

+0

DISTINCT適用於整個選定的行,而不僅僅是第一列。你必須決定的是當一個tb3.Id值對於其他列,MAX/MIN/SUM/AVG等有不同的值時,預期的結果是什麼?一般的GROUP BY規則如下所示: 如果指定了GROUP BY子句,則SELECT列表中的每個列引用必須標識分組列或作爲set函數的參數。 – jarlh

+0

我同意你的獨特性,但是可以僅在一個字段上使用相同的東西,而不必看其他的東西? – Julien698

回答

1

由於mentio在評論中,你需要確保你加入正確的密鑰。如果不知道數據模型的外觀如何,很難回答這個問題。

有沒有這樣的事情「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 
+0

它完美的作品!謝謝 !! – Julien698

相關問題