Задача удвоения записи при простом левом соединении - PullRequest
0 голосов
/ 27 мая 2011

Я выполняю этот запрос:

CREATE TABLE
SELECT people.*, Sheet1.department
  FROM people LEFT JOIN Sheet1 ON people.depno = Sheet1.depno

На наборе таблиц, в которых подробно описываются записи сотрудников.

Цель - создать новую таблицу свсе данные о людях, а также понятное человеку название отдела.Все просто, верно?

Проблема в том, что каждая запись в результирующей таблице выглядит точно дублированной (буквально все поля одинаковы), превращая таблицу из примерно 23 000 записей впримерно 46000 записей в таблице.Я говорю «грубо», потому что это не точное удвоение - разница составляет около ста записей.

Некоторые подробности: таблица «people» содержит 15 полей, включая поле «depno», которое являетсяцелое число, указывающее отдел.

Таблица «Лист1», как можно было бы догадаться, представляет собой таблицу, сгенерированную из импортированного файла xls, содержащего два поля: общее «depno» и новый «отдел» (последний являетсяподробное название отдела, соответствующее рассматриваемому депно).В таблице «Лист1» 44 записи.

Заранее благодарим за любые указания на это.Дайте мне знать, какую другую информацию вы можете использовать от меня.


Обновление: вот код, который я в итоге использовал, из моего ответа Йохану (еще раз спасибо всем, кто работал над этим):

CREATE TABLE morebetter 
    SELECT people.*, Sheet1.department FROM people 
    LEFT JOIN Sheet1 ON people.depno = Sheet1.depno 
    GROUP BY id 

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Похоже, что поле Sheet1.depno не уникально?

0 голосов
/ 27 мая 2011

people.depno не является уникальным, поэтому вы получаете удвоение.

Измените часть SELECT на

SELECT DISTINCT people.*, Sheet1.department
  FROM people LEFT JOIN Sheet1 ON people.depno = Sheet1.depno

Это исключит повторяющиеся строки.

В MySQL вы также можете написать

SELECT people.*, Sheet1.department
FROM people LEFT JOIN Sheet1 ON people.depno = Sheet1.depno
GROUP BY people.depno

, который работает немного иначе.
Первый запрос удаляет строки с дубликатом output , второй запрос удаляет записи с дубликатом people.depno, даже если people.depno не появится в выводе.

Мне нравится вторая форма, потому что она явно указывает, какой дубликат вы пытаетесь устранить, и вам не нужно настраивать вывод.
Это также немного быстрее во времени выполнения.

*** Предупреждение ***
Версия group by удалит все двойные people.depno, которые он найдет, но если другие поля в выборке не идентичны, он просто выберет одно вСлучайно!
Другими словами.Если результат select distinct отличается от версии group by, это означает, что MySQL автоматически отбрасывает неповторяющиеся строки.
Это может или не может быть тем, что вы хотите!

Чтобы быть в безопасности, сделайте group by для всех полей, которые вас интересуют!
Если group by находится на клавише unique, то включать его бессмысленнодругие поля из той же таблицы, что и этот уникальный ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...