2013-12-03 30 views
-1

我想學習SQL,而我回答書中的一些問題,但我無法找到答案有人可以幫我這個簡單的SQL問題

問題是

鑑於一個由兩列'id'和'name'組成的數據庫表'names',什麼查詢會找到重複的名字?

SELECT * FROM names GROUP BY name WHERE id > 1; 
SELECT * FROM names n1 LEFT JOIN names n2 ON n1.name = n2.name; 
SELECT * FROM names n1 JOIN names n2 ON n1.name = n2.name AND n1.id != n2.id; 
SELECT * FROM names n1 LEFT JOIN names n2 ON n1.id != n2.id; 
+2

爲什麼你就不能創建臨時表和本次測試自己呢? –

+0

您可以使用[SQLFiddle](http://sqlfiddle.com)即時創建數據庫並對其進行測試。 –

+0

或者您應該閱讀教程。例如:http://www.w3schools.com/sql/ 否則,這兩種解決方案都不是完美的......唯一能夠顯示重複項的解決方案將使它們乘以重複次數。 –

回答

1

這將告訴你發生一次以上的所有名稱:

SELECT COUNT(1), Name FROM names GROUP BY name HAVING COUNT(1) > 1 

1號是不是有效的查詢。 GROUP BY需要在查詢中使用某個聚合函數,並且您不希望聚合的所有其他列都必須在GROUP BY中列出。 WHERE ID > 1部分將僅以id 1取消該記錄,但不會超過該記錄。

2號也不起作用。它只會產生一個列表,其中所有帳戶在同一行中列出兩次。

4號會給你幾乎相同的東西cross join

數字3實際上會做的伎倆,雖然以一種不那麼有效的方式。它基本上將表加入到表中,使用名稱作爲JOIN運算符,然後使用WHERE n1.id != n2.id子句確保如果名稱存在多次,它將不會自行加入該行。因此,它給你一個所有重複名稱的列表。

它效率不高的原因是,如果您有1個名稱存在幾十次,您仍然會得到結果中的很多行,現在您仍然可以輕鬆地看到只有不止一次存在的名稱。在一百萬行的表上,運行查詢可能也需要大量的時間,因爲基本上使用字符字段作爲JOIN(這不是非常有效)。

+0

海報正在尋找的答案在他們提供的選擇陳述之一中。 – Linger

+0

@Linger我剛剛在個人查詢和他們的答案編輯。我仍然認爲即使#3可以做到這一點,但這不是一種有效的方法。 – SchmitzIT

+1

* @ SchmitzIT *,儘管可以通過多種方式獲得結果,但OP只希望在預定義列表中找到正確答案。只是說選項3會起作用並不能解釋爲什麼它會起作用。如果你展開爲什麼選項3是樣本的正確答案,並解釋每個查詢的實際含義,這將有助於用戶更多地說明它的工作原理。 – Linger

0

這是你的答案。

SELECT * FROM names n1 JOIN names n2 ON n1.name = n2.name AND n1.id != n2.id; 
0

第三個是你的答案

SELECT * FROM names n1 JOIN names n2 ON n1.name = n2.name AND n1.id != n2.id; 

它說,從上表names的地方,如果與自己相比全選,名稱相同,但ID是不。

隨着見下表:

1 Bob 
2 Bob 
3 George 

它會顯示:

1 Bob 2 Bob 
2 Bob 1 Bob 
1
SELECT * FROM names n1 JOIN names n2 ON n1.name = n2.name AND n1.id != n2.id; 

這種說法是你的answer..Because: 假設你有一個表名:名 其有兩個列ID和名稱。首先,這個查詢從名字表中選擇所有的數據,然後比較它自己的名字=名字,如果ID!= ID。最後它返回想要的結果..

-1
Select name 
from names 
group by 1 
having count(name) > 1; 

這組名稱列,其計數大於1將被抽取作爲複製

+0

此查詢在「group by 1」上有語法錯誤 – FLICKER

+0

實際上,這在sql中對我很好。否則,即使這將工作:從名稱組中選擇名稱count(name)> 1; –