2015-03-23 4 views
1

Следующий запрос возвращает много правильных строк, но не возвращает строку для seed = '1985.00-Miller-13' (есть и другие, но это только один пример):SQL Query, похоже, возвращает неполный результат

SELECT g.dam_alias "Seed" 
FROM genetic g LEFT OUTER JOIN (genetic g1d) 
ON (g.dam_alias = g1d.genetic_alias) 
GROUP BY g1d.dam_alias , g1d.sire_alias; 

Однако, если я добавлю предложение WHERE к запросу, указав строку, которая, как мне кажется, отсутствует, появляется. Вот измененный запрос:

SELECT g.dam_alias "Seed" 
FROM genetic g LEFT OUTER JOIN (genetic g1d) 
ON (g.dam_alias = g1d.genetic_alias) 
WHERE g.dam_alias = '1985.00-Miller-13' -- this is the added line 
GROUP BY g1d.dam_alias , g1d.sire_alias; 

Если мой первоначальный запрос действительно не должен был возвратить строку для затравки «1985,00-Миллер-13», я ожидал бы второй запрос не вернуть ни одной строки.

Сначала я подозревал, что мои ключи/индексы были повреждены, поэтому я сделал дамп db и перестроен из полученного SQL-скрипта. Я реплицировал проблему, используя MYSQL v5.6 и MariasDB v 10.0.17

Я проверил данные вручную и просмотрел запрос на бумаге и не нашел ничего, что не соответствовало моим ожидаемым результатам.

Любые предложения были бы весьма полезными. Я могу предоставить любую дополнительную информацию/схему/данные, которые могут кому-то понадобиться.

Спасибо.

+0

Спасибо вам всем, кто прокомментировал. Комментарии были заметны и были чрезвычайно полезны, когда я понял, что происходит и где моя ошибка. Добавление g.dam_alias в группу, разрешив проблему. Вот фиксированный запрос: – graybeard

+0

SELECT, g.dam_alias "Seed" ИЗ Генетический г LEFT OUTER JOIN (генетический G1D) ON (g.dam_alias = g1d.genetic_alias) GROUP BY g.dam_alias, g1d.dam_alias, g1d.sire_alias ; – graybeard

ответ

1

Вы используете left outer join и group by ссылки второй стол. Эти значения могут быть NULL. Возьмите столбец из первой таблицы:

SELECT g.dam_alias "Seed" 
FROM genetic g LEFT OUTER JOIN 
    genetic g1d 
    ON g.dam_alias = g1d.genetic_alias 
GROUP BY g.dam_alias, g1d.sire_alias; 
---------^ 
+0

Помимо имени того же столбца, нет ничего, что могло бы предполагать, что 'g.dam_alias = g1d.dam_alias' независимо от внешнего соединения (это не критерий объединения). – eggyal

+0

Спасибо. Я беру все эти полезные советы и пересматриваю свой запрос. – graybeard

+0

@eggyal. , , На самом деле я предполагал, что это была опечатка. –

2

Вы группируя на g1d.dam_alias, но выбор g.dam_alias.

Большинство других продуктов РСУБД не позволяют выбирать неагрегантные столбцы изнутри группы, так как он неоднозначен от , который записывает в группу, значение должно быть возвращено. MySQL тем не менее разрешает эту операцию как повышение производительности, хотя документация ясно, что результаты в таких случаях являются неопределенными:

См (подчеркивание добавлено) MySQL Handling of GROUP BY:

MySQL расширяет использование GROUP BY таким образом, что список выбора может ссылаться на неагрегированные столбцы, не названные в предложении GROUP BY. Это означает, что предыдущий запрос является законным в MySQL. Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов. Однако это полезно прежде всего, когда все значения в каждом неагрегированном столбце, не названном в GROUP BY, одинаковы для каждой группы. Сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными.

Что (по-видимому, мы не можем сказать наверняка, не видя исходные данные) происходит то, что g.dam_alias = '1985.00-Miller-13' существует в некоторых группах, но разные значения g.dam_alias из других записей в пределах этих групп выбираются вместо этого. Когда вы добавляете фильтр, нет других значений для выбора, и, следовательно, выбранное значение гарантируется тем, которое вы ожидаете.

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

+0

Спасибо! Очень полезно. Позвольте мне переварить это и посмотреть, не могу ли я построить другой запрос, который будет отвечать моим потребностям. – graybeard

+0

Спасибо, eggyal! Ваш очень тщательный ответ заставил меня на правильной странице, и проблема была решена путем исправления моей группы по статье. – graybeard

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