Sybase ASE имеет функциональное расширение по сравнению со стандартом ANSI group by , где он может принимать в некоторых полях, которые не входят в group, . Конечным результатом является своего рода самостоятельное объединение, и даже в документации говорится, что это очень запутанная функция.
Пример:
create table #a(id numeric(9), client varchar(50), city varchar(50))
insert #a values (1, 'aaa','New York')
insert #a values (2, 'aaa','New Jersey')
insert #a values (3, 'bbb','New York')
insert #a values (4, 'ccc','New Jersey')
insert #a values (5, 'aaa','Atlanta')
select count(*),city from #a group by city
select count(*),city,client from #a group by city,client
select count(*),city,client from #a group by city
Результаты:
-- |city |
-- --|-----------|
-- 2 |New York |
-- 1 |Atlanta |
-- 2 |New Jersey |
--
-- |city |client |
-- --|-----------|-------|
-- 1 |New Jersey |ccc |
-- 1 |New Jersey |aaa |
-- 1 |New York |bbb |
-- 1 |Atlanta |aaa |
-- 1 |New York |aaa |
--
--
-- select count(*),city,client from #a group by city
-- |city |client |
-- --|-----------|-------|
-- 2 |New York |aaa |
-- 2 |New York |bbb |
-- 1 |Atlanta |aaa |
-- 2 |New Jersey |aaa |
-- 2 |New Jersey |ccc |
Хотя первые два запроса являются стандартными, последний не удастся выполнить в большинстве баз данных, кроме SYBASE ASE.
В запросе: выберите количество (*), city, клиент из #a группы по городам, city не входит в группу по
Результаты сбивают с толку, и это очень легко ошибиться, добавив дополнительное поле в предложение select. В этом случае не только результаты сбивают с толку, но запрос может вызвать сканирование полной таблицы и больших таблиц, что может привести к длительному времени, пока проблема не станет очевидной.
Есть ли способ использования конфигурации клиент / соединение (или что-то еще), чтобы отключить эту функцию?