2013-03-22 3 views
0

У меня есть SQL-запрос, состоящий из двух операторов SELECT, которые объединены вместе. Когда они запускаются индивидуально, первый SELECT возвращает 10 записей, а второй SELECT возвращает 1 запись, поэтому, когда я UNION из двух SELECT, я ожидаю получить 11 записей, но это не так, я получаю только 9 записей.Заявление UNION, показывающее несогласованные результаты

Из-за природы SQL я не могу опубликовать его здесь, но он состоит из множества JOINS по 5 таблицам. Все возвращаемое является правильным и действительным.

Просто интересно, видел ли кто-нибудь этот вопрос, когда UNION'ые два оператора SELECT, и если у кого-то есть какие-либо советы относительно того, что может быть причиной или даже указать мне в правильном направлении, спасибо.

+4

вы не должны ожидать ровно 11 записей. UNION будет «объединять» дубликаты в одну строку, поэтому вы должны ожидать записи MAX 11. Если вы получаете 9, это, вероятно, означает, что они являются дубликатами в первых 10 записях ... Можете ли вы попробовать с UNION ALL? И/или попробуйте DISTINCT в первом запросе, чтобы узнать, сколько строк вы получите. –

+0

Мы не можем помочь вам, если вы не опубликуете код. «UNION» не должен вести себя так, поэтому код будет иметь решающее значение для определения проблемы. Я бы предложил создать [SQLFiddle] (http://sqlfiddle.com) с кодом, который показывает проблему - он не обязательно должен быть вашим точным кодом - это просто то, что проявляет то же поведение. –

+0

@ RaphaëlAlthaus Спасибо за это, отлично работает сейчас, не знал о опции ALL. :) – llanato

ответ

3

UNION удалить дубликаты по умолчанию. Чтобы предотвратить удаление дубликатов, необходимо использовать UNION ALL.

Цитируя документации:

поведение по умолчанию для UNION является то, что повторяющиеся строки удаляются из результата. Дополнительное ключевое слово DISTINCT не имеет никакого эффекта, кроме значения по умолчанию, поскольку оно также указывает удаление дубликатов строк. С необязательным ключевым словом ALL удаление дубликатов строк не происходит, и результат включает все соответствующие строки из всех операторов SELECT.

0

По умолчанию Oracle применяет неявное отдельное предложение к результату объединения. Вы можете проверить, есть ли в результатах ваших отдельных запросов общие элементы.

Если вы не хотите этого поведения, вам нужно вместо этого использовать предложение UNION ALL.

0

попытаться использовать UNION ALL вместо UNION. UNION возвращает только отдельные строки. Check this out.

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