2013-12-03 7 views
-1

Я пытаюсь научиться SQL, и я отвечаю на некоторые вопросы в книге, но я не мог найти ответы может кто-то пожалуйста, помогите мне с этимПростые вопросы SQL

вопрос является

Учитывая «имена» таблицы базы данных, состоящие из двух столбцов «id» и «name», какой запрос найдет дубликаты имен?

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, чтобы гарантировать, что если имя существует более одного раза, оно не будет присоединяться к строке непосредственно. Таким образом, он дает вам список всех повторяющихся имен.

Причина, по которой это не очень эффективно, состоит в том, что если у вас есть одно имя, которое существует десятки раз, вы все равно получите много строк в результате, и вы все равно теперь сможете легко увидеть только имена, которые существуют более одного раза. На миллионной таблице строк также может потребоваться значительное количество времени для выполнения запроса, поскольку в основном вы используете поле символов для 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, где, если по сравнению с собой, имена одинаковы, но идентификаторы не являются.

с приведенной ниже таблицей:

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: Представьте у вас есть имя таблицы: имена Сво имеет два идентификатора и имя столбца. Во-первых, эти запросы выбирают все данные из таблицы имен, а затем сравнивают себя name = name и id id = id. Наконец, он возвращает желаемый результат.

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

Это будет группа столбец имен и, количество которых больше 1 будет извлечено, как дублировать

+0

Этот запрос имеет синтаксическую ошибку в «group by 1» – FLICKER

+0

На самом деле это сработало для меня в sql. Или даже это будет работать: выберите имя из группы имен по имени, имеющему счет (имя)> 1; –

Смежные вопросы