группировка, но не агрегирование с внешним соединением SQL, без сортировки - PullRequest
0 голосов
/ 09 июня 2018

У меня есть две таблицы foo и bar.Для каждого foo есть ноль или более баров.Достаточно просто сделать LEFT OUTER JOIN, чтобы получить набор результатов, в котором каждая строка дает мне foo плюс один из его столбцов (или NULL, если с foo не связано ни одного столбца).

Но скажем, я хочу, чтобы все результаты сгруппировали foos вместе.Обратите внимание, что я не хочу, чтобы они агрегировались;то есть я не хочу, чтобы все строки foos с каждым первичным ключом были свернуты.Если есть foo с первичным ключом foo123, я просто хочу, чтобы все foo123 foos отображались вместе.Я не хочу, чтобы там было, например, [foo123, foo123, foo456, foo123];Я хочу [foo123, foo123, foo123, foo456] или даже [foo456, foo123, foo123, foo123].

Конечно, я мог бы сортировать по первичному ключу foo, но сортировка кажется излишней, так как мне безразличен порядок foos;только то, что все foo с одним и тем же идентификатором выглядят «сгруппированными» в наборе результатов.

Есть ли в SQL более эффективный способ «группировать лайки» на основе некоторых критериев без сортировки?

Я использую Oracle на тот случай, если это имеет значение.

(Для чего у меня была «блестящая» идея использовать объединение с коррелированным подзапросом для просмотра столбцовнезависимо для каждого foo, но я забыл, что у меня не может быть коррелированного подзапроса в предложении FROM.)

1 Ответ

0 голосов
/ 09 июня 2018

Я не верю, что есть надежный способ сделать это, кроме:

ORDER BY foo.foo_primary_key

Причина в том, что при отсутствии ORDER BY порядок результатов, возвращаемых *Заявление 1005 *: undefined .

Могут быть способы написания запроса, который в вашей версии Oracle будет возвращать результаты, сгруппированные так, как вам нужно, без использования ORDER BY -но это может неожиданно измениться.Было бы неразумно полагаться на такие решения.

...