2010-11-21 54 views
1

我有一個問題,使用獨​​特的*。我有一個表,作爲一個加入,我試圖做一個聲明,如:使用不同於*

SELECT DISTINCT Name, * FROM table_a JOIN table_a.id=table_b.id WHERE status=1 

但它不允許我這樣做。有沒有使用Distinct with *選項的方法?

+1

我們在談論哪種SQL方言?另外,你確定DISTINCT是否是問題,而不是'Name,*'部分? – 2010-11-21 14:46:27

+0

爲什麼這個標籤'mysql'和'postgresql'? – 2010-11-21 14:48:01

+0

什麼是錯誤信息? – JJJ 2010-11-21 14:50:57

回答

1

我目前無權測試此權限,但我懷疑問題不在於distinct,而是您在每個表中都有相同名稱的列(如id),並且它不知道哪個在兩個相互衝突的列中進行選擇。如果你做select distinct table_a.*, table_b.* ...,它會改變嗎?

+0

使用select distinct_table。*,table_b。*它不再產生錯誤,但是當我這樣做時,distinct也不起作用 – 2010-11-21 15:20:32

+0

@Devin - 然後選擇您想要明確選擇的列,並列出它們而不是使用「*」。 – tvanfosson 2010-11-21 18:37:35

+0

好的,我明白了,謝謝! – 2010-11-22 00:46:09

1

DISTINCT *可能會返回所有行,因爲它們是不同的:-)

要獲得所有不同的名稱使用DISTINCT name或檢索有關名稱一些統計數據(例如計數)使用SELECT name, COUNT(*) FROM ... GROUP BY name

0

目前尚不清楚你想要做什麼。

也許你想只返回一個給定名稱的列(不是兩個id列)。

在這種情況下,標準的SQL查詢是這樣的:

SELECT * FROM table_a JOIN table_b USING (id) WHERE status=1 

關鍵字DISTINCT裝置,在進行選擇之後,重複的行被消除(不重複的列名)。

0

基本上解決方案更是這樣的:

SELECT * 
FROM table_a, table_b 
JOIN table_a.id = table_b.id 
WHERE status = 1 
GROUP BY table_a.name 

這是有用的,如果你想避免屬性的枚舉。當你這樣做,並且關係改變(一個屬性被刪除或添加)時,你的查詢將不起作用。

閱讀全文:MySQL 8.3.1.13. DISTINCT Optimization

+0

這是一個非常古老的問題!你的語法無效(提示:你的'FROM'子句不應該包含一個名爲'table_b'的表嗎?)我懷疑答案是'SELECT * FROM table_a NATURAL JOIN table_b WHERE status = 1;' – onedaywhen 2012-04-23 10:43:34

+0

@onedaywhen:對不起,我剛修改了缺失的詞彙。你的答案是什麼意思?接受的答案不起作用,並且在使用'*'時它不能解決'DISTINCT'的問題。 – Dyin 2012-04-23 10:52:38

+0

您修改的查詢返回重複的列。當然,我只能猜測,但我認爲OP需要不同的列(而不是不同的行),「NATURAL JOIN」是實現這一目標的好方法。 – onedaywhen 2012-04-23 12:16:04

相關問題