2011-11-02 31 views
0

我得到每個部分的雙重結果...所以我顯然不使用Distinct在這裏或需要使用分組?DISTINCT仍然給我結果中的dups記錄

例如:

select DISTINCT p.PartNum, 
       p.PartID, 
       pn.Name, 
       d.[Description], 
       n.Note as PartNote 
from Part p 
      join PartName pn on pn.PartNameID = p.PartNameID 
      join ApplicationPaint ap on ap.partID = p.PartID 
      join [Application] a on a.ApplicationID = ap.ApplicationID 
      join [Description] d on d.DescriptionID = ap.DescriptionID 
      join Note n on n.NoteID = a.NoteID 
      join MYConfig mmy on mmy.MMYConfigID = a.MYConfigID 
      join Model mo on mo.ModelID = mmy.ModelID 
where mmy.ModelId = 2673 
and substring(n.Note, CHARINDEX(']', n.Note) + 2, LEN(n.Note))= 'Johnson' 

結果:

T50015 765963 Some Part Name SomeNoteA [342] Johnson 
T50015 765963 Some Part Name SomeNoteA [343] Johnson 
T60024 766068 Some Part Name SomeNoteB [342] Johnson 
T60024 766068 Some Part Name SomeNoteB [343] Johnson 
T60231 766093 Some Part Name SomeNoteA [342] Johnson 
T60231 766093 Some Part Name SomeNoteA [343] Johnson 
T60232 766094 Some Part Name SomeNoteA [342] Johnson 
T60232 766094 Some Part Name SomeNoteA [343] Johnson 
T70134 766150 Some Part Name SomeNoteA [342] Johnson 
T70134 766150 Some Part Name SomeNoteA [343] Johnson 
T70230 766153 Some Part Name SomeNoteC [342] Johnson 
T70230 766153 Some Part Name SomeNoteC [342] Johnson 
T70230 766153 Some Part Name SomeNoteC [343] Johnson 
Y50078 766253 Some Part Name SomeNoteH [342] Johnson 
N30026 766352 Some Part Name SomeNoteT [342] Johnson 
N30026 766352 Some Part Name SomeNoteT [343] Johnson 
N50041 766465 Some Part Name SomeNoteK [342] Johnson 
N50041 766465 Some Part Name SomeNoteK [343] Johnson 
N60176 766499 Some Part Name SomeNoteX [342] Johnson 
N60176 766499 Some Part Name SomeNoteX [343] Johnson 
N60750 766503 Some Part Name SomeNoteU [342] Johnson 
N60750 766503 Some Part Name SomeNoteU [343] Johnson 

所以我得到的DUP甚至兩倍,在每個部分號碼

T70230 766153 Some Part Name SomeNoteC [342] Johnson 
T70230 766153 Some Part Name SomeNoteC [342] Johnson 
T70230 766153 Some Part Name SomeNoteC [343] Johnson 

T50015 765963 Some Part Name SomeNoteA [342] Johnson 
T50015 765963 Some Part Name SomeNoteA [343] Johnson 

所以我希望看到的是這樣的:

T50015 765963 Some Part Name SomeNoteA [342] Johnson 
T60024 766068 Some Part Name SomeNoteB [342] Johnson 
T60231 766093 Some Part Name SomeNoteA [342] Johnson 
T60232 766094 Some Part Name SomeNoteA [342] Johnson 
T70134 766150 Some Part Name SomeNoteA [342] Johnson 
T70230 766153 Some Part Name SomeNoteC [342] Johnson 
Y50078 766253 Some Part Name SomeNoteH [342] Johnson 
N30026 766352 Some Part Name SomeNoteT [342] Johnson 
N50041 766465 Some Part Name SomeNoteK [342] Johnson 
N60176 766499 Some Part Name SomeNoteX [342] Johnson 
N60750 766503 Some Part Name SomeNoteU [342] Johnson 

所以我想每個唯一零件編號只有一個唯一的行,而不是顯示在這裏的dup零件編號行。

所以把它換句話說,例如我想這(一個行,只有一個PARTID):

T70230 766153 Some Part Name SomeNoteC [342] Johnson 

與DUP的:

T70230 766153 Some Part Name SomeNoteC [342] Johnson 
T70230 766153 Some Part Name SomeNoteC [342] Johnson 
T70230 766153 Some Part Name SomeNoteC [343] Johnson 

回答

2

你省略部分的名稱和說明您的例子,但我相信DISTINCT意味着它應該從結果中省略行,其中所有你所指定的列是重複的,不任何

那麼既然你已經指定p.PartNump.PartIDpn.Named.[Description],並且n.Note,只有在所有被複制這些值將被刪除的行。

例如,你說你的結果包括:

T70230 766153 Some Part Name SomeNoteC [342] Johnson 
T70230 766153 Some Part Name SomeNoteC [342] Johnson 
T70230 766153 Some Part Name SomeNoteC [343] Johnson 

如果這些行真的:

T70230 766153 CoolWidget1 "So much fun!"  [342] Johnson 
T70230 766153 CoolWidget1 "Buy one today!" [342] Johnson 
T70230 766153 CoolWidget2 "Buy one today!" [343] Johnson 

然後,所有三排將繼續,因爲沒有有確切相同您爲DISTINCT運算符列出的所有五列名稱的值。

+0

難以置信......是啊,有時在[]數字有所不同 – PositiveGuy

+0

就是這樣。所以,因爲我不需要[]數字,所以我把它從最後一列中刪去,這樣他們都可以說約翰遜...然後獨特的工作很好。謝謝! – PositiveGuy

0

發生了什麼事是你複製你的連接中的行。請記住,Distinct不一定會過濾選擇列表中的列(請在此處閱讀:http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx)。

有一些解決方案,這個堡壘從:

SELECT DISTINCT * FROM (
select   p.PartNum, 
       p.PartID, 
       pn.Name, 
       d.[Description], 
       n.Note as PartNote 
from Part p 
      join PartName pn on pn.PartNameID = p.PartNameID 
      join ApplicationPaint ap on ap.partID = p.PartID 
      join [Application] a on a.ApplicationID = ap.ApplicationID 
      join [Description] d on d.DescriptionID = ap.DescriptionID 
      join Note n on n.NoteID = a.NoteID 
      join MYConfig mmy on mmy.MMYConfigID = a.MYConfigID 
      join Model mo on mo.ModelID = mmy.ModelID 
where mmy.ModelId = 2673 
and substring(n.Note, CHARINDEX(']', n.Note) + 2, LEN(n.Note))= 'Johnson' 
) 

要使用GROUP BY而不是不同的,以修改JOIN所創建的複製行。喜歡的東西:

select DISTINCT p.PartNum, 
       p.PartID, 
       pn.Name, 
       d.[Description], 
       n.Note as PartNote 
from Part p 
      join (SELECT Distinct Name, PartNameID 
        FROM PartName) pn ON pn.PartNameId = p.PartNameID 
      join ApplicationPaint ap on ap.partID = p.PartID 
      join [Application] a on a.ApplicationID = ap.ApplicationID 
      join [Description] d on d.DescriptionID = ap.DescriptionID 
      join Note n on n.NoteID = a.NoteID 
      join MYConfig mmy on mmy.MMYConfigID = a.MYConfigID 
      join Model mo on mo.ModelID = mmy.ModelID 
where mmy.ModelId = 2673 
and substring(n.Note, CHARINDEX(']', n.Note) + 2, LEN(n.Note))= 'Johnson' 
+0

啊絕對不想做子選擇...壞。讓我試試 – PositiveGuy

+0

這個小組我不想要任何子選擇......表現和只是不好的練習。嗯,必須有一種方法,而不必做一個子選擇。再次,[343]並不總是相同的......所以,約翰森說這可能是爲什麼我得到了蠢貨... – PositiveGuy

0

DISTINCT將組合行,但它們必須完全相同。從您選擇的PartNote字段中刪除會爲您提供唯一的集合。

爲了得到PartNote因爲你已經在你的例子所示呢,下面應該工作...

select DISTINCT p.PartNum, 
      p.PartID, 
      pn.Name, 
      d.[Description], 
      min(PartNote) 
    .... 
    group by p.PartNum, p.PartID, pn.Name, d.[Description]