2010-08-05 71 views
0

除了使用DISTINCT函數之外,是否有更好的方法從一個表中的三列中獲取所有不同的值?我也試過GROUP BY,但是成本似乎沒有任何明顯的差異。DISTINCT函數的替代函數

SELECT DISTINCT Table1.Col1, Table2.Col1, Table1.Col3 
FROM Table1 
INNER JOIN Table2 ON Table1.FK = Table2.ID 
WHERE Table1.Foo = 1865 AND Table2.Type = 1 
+3

您的FROM子句中沒有'Table3'。 – RedFilter 2010-08-05 20:09:36

+0

這裏有什麼情況?你爲什麼要拋棄數據? – 2010-08-05 20:09:54

+0

相關問題,爲什麼你*不想*清除數據? 「DISTINCT」在這裏沒有可用的原因嗎? – 2010-08-05 23:17:09

回答

0

不,沒有,但是如果你在這方面的表現非常糟糕,你可能需要考慮索引。如果您提供更多詳細信息,也許我們可以幫助解決這個問題

2

不,那就是這樣做的。

雖然,你可以嘗試:

SELECT DISTINCT Table1.Col1, Table2.Col2 
FROM Table1 
INNER JOIN Table2 ON Table1.FK = Table2.ID AND Table2.Type = 1 
WHERE Table1.Foo = 1865 

速度將取決於您的數據。

另見sql group by versus distinct

+0

將'Table2.Type = 1'條件移動到JOIN子句將不會影響性能。 – 2010-08-05 20:13:02

+0

@Ryan W Tenney:但它會影響返回的結果,因爲當標準在JOIN上時,它發生在之前。 – 2010-08-05 20:16:33

+0

@OMG小馬:不,它不會影響結果。在連接中的on子句和where子句之間移動條件只會影響爲外部連接返回的結果,但不影響內部連接的結果。 – 2010-08-05 20:56:01

4

GROUP BY旨在用於聚合函數使用; DISTINCT僅從可見性中刪除重複項(基於每行匹配的所有列值)。

如果TABLE2允許與TABLE1記錄關聯的重複值,則必須使用任一選項。取決於數據和你想看什麼,但你可以使用&集合函數得到TABLE2中最高(使用MAX)或最低(使用MIN)值...

0

你可以嘗試移動條件在你的連接的'哪裏',但我希望它們的解析也是一樣的。

如果你想提高性能,添加一個索引來Table1.Foo和Table2.Type

1

您是否嘗試過創建您所選擇的字段的索引?

DISTINCT和GROUP BY的相對成本很有意義。處理數據的一種方式(也可能是其使用方式)是按照您提供的字段對行進行排序。然後,兩者之間的區別在於DISTINCT跳過等於上一行的行,而GROUP by恰好使用相同的度量值相等來運行計數。

0
create table #temp (col1 int, col2 int, col3 int) 
create index temp_index on #temp (col 1) 

insert into #temp 
SELECT Table1.Col1, Table2.Col1, Table1.Col3 
FROM Table1 
INNER JOIN Table2 ON Table1.FK = Table2.ID 
WHERE Table1.Foo = 1865 AND Table2.Type = 1 

select distinct col1, col2, col3 
from #temp 
+0

歡迎使用stackoverflow!感謝您提供答案。一個關於你的代碼的解釋,即使是一個小的解釋,對於其他人的決定是否會對他們有用是很有幫助的。 – LarsH 2013-10-24 15:02:34