powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Странные возможности Sybase ASE
31 сообщений из 31, показаны все 2 страниц
Странные возможности Sybase ASE
    #34100182
Здравствуйте!
Давно хотел спросить, почему ASE позволяет делать некие нестандартные штуки, связанные с агрегирующими функциями.

Например:

1. аггрегаты + сортировка

select count(*) from table1 order by id

возвращает столько count-ов сколько строк в таблице

2. позволяет иметь в запросе с групировкой столбец без аггрегирующей функции и не упомянутый в группировке

select count(*),id,mydate from table1 group by mydate

выполняется, разворачивая группировку по этому столбцу


Ни MS SQL Server, ни Sybase ASA не позволяют таким запросам выполниться,
ругаются, о чем собственно и написано в книжках про SQL.
Зачем в ASE такое позволено и как это согласовано со стандартами?
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34113668
yourij_mw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трава у дома
2. позволяет иметь в запросе с групировкой столбец без аггрегирующей функции и не упомянутый в группировке
select count(*),id,mydate from table1 group by mydate
выполняется, разворачивая группировку по этому столбцу

Это я тоже сразу заметил есчё на начале моей трудовой деятельности. Хоть такие штуки и часто очень полезны
позволяя существенно упростить запрос но иногда, когда выборка делаеться по обединению с нескольких таблиц, то как для меня результат часто непредсказуем если не написать как по стандарту. И "нельзя сметь" в таком случае случайно ошибнутся, например подставить не то имя колонки в списке селект, что и в групбай: "множит" всё что попало и если таблицы большие то моментально забивается лог в tempdb где создаются рабочие таблицы, select lct_admin('abort',0,2) чтобы успеть запустить очистку лога меня не спасает т.к так можно делать и делать.... за то время пока отменятся ждущие транзакции появляються новые и новые..... Но это уже другая история .
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34113676
yourij_mw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... на счёт грамматики (ну типа "есчё".. и т.д.) не обращайте внимание если можно...
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34113841
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трава у домаЗдравствуйте!
Давно хотел спросить, почему ASE позволяет делать некие нестандартные штуки, связанные с агрегирующими функциями.

...

Ни MS SQL Server, ни Sybase ASA не позволяют таким запросам выполниться,
ругаются, о чем собственно и написано в книжках про SQL.
Зачем в ASE такое позволено и как это согласовано со стандартами?



Потому что "потому" кончается на "У"

На самом деле это все одна и та же фича, позволено иметь в запросе с агрегатами колонки , не входящие ни в GROUP BY, ни в агрегатные функции.
Это бред, но вот какой-то чудик это придумал давно -- так эта фича и тянется. Никто не знает уже , зачем она, почему она и вообще (включая инженеров Sybase, был на форуме такой вопрос, дооолго они его мурыжили, мы их все склоняли к тому, что это надо запретить ...).
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34114260
Andyn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто бред, но вот какой-то чудик это придумал давно -- так эта фича и тянется. Никто не знает уже , зачем она, почему она и вообще (включая инженеров Sybase, был на форуме такой вопрос, дооолго они его мурыжили, мы их все склоняли к тому, что это надо запретить ...). Действительно правильно сказали: "Баг переходящий из версии в версию становится фичей".
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34114437
Ведь эта "фича" позволяет просто-напросто получать неправильные результаты. С ужасом обнаружил, что у нас один товарищ ее некоторое время использовал и только недавно он догадался, мол что-то не то
Хоть бы они в sp_confugure сделали флажок, позволяющий эту мерзость отключить.
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34114479
Ну вот буквально на днях обнаржуил интересную особенность ASE 12.5.3
begin tran test
select 'begin tran', @@trancount
save tran test
select 'save tran', @@trancount
rollback tran test
select 'rollback tran 1', @@trancount
rollback tran test
select 'rollback tran 2', @@trancount
rollback tran test
select 'rollback tran 3', @@trancount

В общем, не хочет он откатывать именованную транзакцию в этом случае :)
Обычный rollback tran спокойно пройдет...

И ваще, почему select NULL + 'bla' выдает 'bla' и это никак вроде не настраивается? в отличии от MSSQL? (буду рад узнать что я неправ)

Так что нелогичностей накопилась уже куча... Печально...
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34116686
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трава у домаВедь эта "фича" позволяет просто-напросто получать неправильные результаты. С ужасом обнаружил, что у нас один товарищ ее некоторое время использовал и только недавно он догадался, мол что-то не то
Хоть бы они в sp_confugure сделали флажок, позволяющий эту мерзость отключить.

Если бы только получались неправильные результаты.

По факту, добавление колонки, не входящей в GROUP BY, влечет за собой
построение декартового произведения результата группировки и исходной таблицы, из которой берется эта колонка.

У нас это иногда приводило просто к краху сервера - переполнялся tempdb, все становилось раком и приходилось просто перегружаться.

И главное - отловить это никак, кроме тщательной проверки кода глазами, невозможно. Т.е. ошибку сделать тривиально просто, последствия такой ошибки достаточно плачевны.
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34116717
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот буквально на днях обнаржуил интересную особенность ASE 12.5.3

...

В общем, не хочет он откатывать именованную транзакцию в этом случае :)
Обычный rollback tran спокойно пройдет...

На сколько я помно, на самом деле в ASE нету именованных транзакций. Т.е. можно указать имя транзакции, но использовать никак нельзя. Может я не прав.
А для откана на savepoint кажется надо делать rollback to savepoint.


И ваще, почему select NULL + 'bla' выдает 'bla' и это никак вроде не настраивается? в отличии от MSSQL? (буду рад узнать что я неправ)



Ну а в этом ничего печального нету, на мой взгляд. Это видимо как -то связано с внутренним представлением NULL, что NULL == пустая строка (на стнаницах данных оно так и есть, на сколько я помню). Но это и вполне логично, если у вас где-то NULL случайно затесался, то вся строка не об-null-иться.
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34117888
sn1251
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
И ваще, почему select NULL + 'bla' выдает 'bla' и это никак вроде не настраивается? в отличии от MSSQL? (буду рад узнать что я неправ)

Ну а в этом ничего печального нету, на мой взгляд. Это видимо как -то связано с внутренним представлением NULL, что NULL == пустая строка (на стнаницах данных оно так и есть, на сколько я помню). Но это и вполне логично, если у вас где-то NULL случайно затесался, то вся строка не об-null-иться.
Но всё-таки is null может отличить '' от NULL. Хотя такое поведение ИМХО и удобнее по сравнению со стандартом SQL, но сайбесовцам должно быть стыдно что опции для совместимости нет.

Но это пустяки по сравнением с тем, что '' (пустая строка) при конкатенации превращается в ' ' (пробел). Это иногда просто бесит!
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34118171
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю что внутри у ASE нет пустой строки, есть только NULL и строка с одним пробелом. Поэтому когда вы пишите константу "", это на самом деле " ".
Поэтому так и работает.

Я все понимаю, я полностью согласен, что поведение нелогично и некорректно, но оно удобно (в смысле NULL) и не такая уж это суперпроблема. Короче, в ASE дофига проблем гораздо серьезнее, это уж можно вытерпеть.

И на самом деле многие проблемы решаются в последних версиях, например, большая проблема была с convert() и невозможностью предсказать или перехватить его ошибки. Теперь добавили функции, позволяющие хотя бы предсказать что ошибка будет, без возникновения этой ошибки.
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34118258
Да, коллеги уже задавали вопрос про эту пустую строку.

Imho лучшим вариантом было бы введение опций, которые позволили бы использовать старый совместимый режим и стандартный.
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34124149
vooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще был интересный случай, когда после реструктуризации таблицы, процедура, обращающаяся к данной таблице и имеющая в своем теле CASE возвращала бред.
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34155315
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Null+строка, для MS SQL

SET CONCAT_NULL_YIELDS_NULL
Controls whether or not concatenation results are treated as null or
empty string values.
--------------------------------------------------------------------

Столбцы в select-list, не входящие в агрегаты и не входящие в клаузу
group by - очень часто видел в пользователських базах (в основном - в
процедурах формирования отчетов).
Кстати, принцип формирования резалтсета - не совсем декартово
произведение всех таблиц. В запросах с объединением нескольких таблиц в
декарт входят таблицы в зависимости от того, в каких клаузах были
упомянуты столбцы таблицы - в select list, агрегате, group by, having etc.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34274479
Приветствую!
Еще один пример из серии парадоксов


Код: plaintext
1.
2.
3.
4.
if ( rtrim('') = '' )  
    print 'match'
else    
    print 'dont match!!' 

получится 'dont match!!'
так как получаются NULLы как пустые строки.
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34277597
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к тому-же
Код: plaintext
select char_length('')

Код: plaintext
1.
2.
3.
result:

----
   1
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34279740
DragoPB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Трава у домаПриветствую!
Еще один пример из серии парадоксов


Код: plaintext
1.
2.
3.
4.
if ( rtrim('') = '' )  
    print 'match'
else    
    print 'dont match!!' 

получится 'dont match!!'
так как получаются NULLы как пустые строки.


Гы, помоему так в сайбейсе всегда и было))
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34279798
Бесспорно. Но они все равно странные :-)
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34290449
yourij_mw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё бывает запрос по объедениню нескольких таблиц возвращает задвоенные записи, приходится писать дистинкт там где недолжно быть необходимым..
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34290873
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yourij_mw пишет:

> Ещё бывает запрос по объедениню нескольких таблиц возвращает задвоенные
> записи, приходится писать дистинкт там где недолжно быть необходимым..

Это как ? пример можно ? Заявление-то серьезное ...
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34300331
yourij_mw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таких случаев помню два или три и это было в разных запросах. Последний случай был гдет-то 2 месяца назад.
Первоначально в запросе процедуры нестояло ограничения distinct и работал запрос правильно и процедура.
Прошло 3-4 месяца и мне сообщили об ошибке вызванной клиентской программой из-за дублирования записей.
Результат менно дублируется и у каждой строчки єсть одна парная выглдело примерно как показано ниже.

2554,54845, 0, 47, 1
4578,45272, 0, 47, 1
4487,45674, 0, 47, 1
2554,54845, 0, 47, 1
4578,45272, 0, 47, 1
4487,45674, 0, 47, 1

клал order by и получал
2554,54845, 0, 47, 1
2554,54845, 0, 47, 1
4487,45674, 0, 47, 1
4487,45674, 0, 47, 1
4578,45272, 0, 47, 1
4578,45272, 0, 47, 1

Т.к. к этому времени я с таким случаем уже был знаком сильно не удивлялся но перепроверил несколько раз исходные данные и запрос.
Проверял план - ничего необычного не нашёл.
Он действительно не должен был возвращать такой результат. Даже проверил тот самый запрос с такими же параметрами (@id_document)
на другой базе (это была база одного из подразделениний состоящей в репликаци (АСА) и исходные данные тоже были одинаковыми).
Результат исполнения там был правильным.
Вот сам и запрос в точности :
Код: plaintext
1.
2.
3.
4.
5.
6.
 select distinct it.ID_InventoryTag,it.id_dovidnykTovarivfirmy,
	  it.RateOfTaxBuying,so.ID_SalesOutlet,so.TypeBaseCinaPidrozdil from
	  InventoryTag as it join PidrozdilFirmy as pf on(pf.ID_PidrozdilFirmy = it.ID_PidrozdilFirmy) join
	  SalesOutlet as so on(so.ID_SalesOutlet = pf.ID_SalesOutlet) join
	  ZalyshokTMC as ztmc on(ztmc.ID_Inventorytag = it.ID_InventoryTag) where
	  ztmc.ID_Zalyshky = any(select a.ID_Zalyshky from Analityka as a where a.ID_Document = @id_document) and
	  pf.TypeRegistrationCost =  1   and it.id_rahunok =  215 
для Таблицы InventoryTag столбец ID_InventoryTag являєтся ПК
PidrozdilFirmy - ID_PidrozdilFirmy тоже ПК
SalesOutlet - ID_SalesOutlet - ПК
отношения между таблицами один ко многим соответственно.
для таблицы ZalyshokTMC - ID_InventoryTag является потенциальным (альтернативным)
ключом по которому построен уникальный индекс таким же и являеться столбец ID_Zalyshky для той же таблицы (ZalyshokTMC)
по которому тоже стоит уникальный индекс. ПК для ZalyshokTMC здесь не участвует.
в таблице Analityka колонка ID_Document имеет обычный индекс ID_Zalyshky также. Есть один индекс на обе (ID_Document,ID_Zalyshky).

Важным фактом являэтся то что сегодня запрос без distinct выполняется правильно.
Ниже предятавлен план, хотя сказать отличиается он или нет от того который я просматривал тогда немогу.
Ещё боллее ранний случай с другим запросом к сожалению очень смутно помню.
Пыталься найти по syscomments ту процедуру с "distinct" и не нашёл..
Может попрбую тогда в єтом запросе убрать distinct и как нибудь отловить тот чудесный момент..

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
QUERY PLAN FOR STATEMENT  1  (at line  1 ).


    STEP  1 
        The type of query is SELECT.

        FROM TABLE
            Analityka
            a
        Nested iteration.
        Index : ix_document_zalyshky
        Forward scan.
        Positioning by key.
        Index contains all needed columns. Base table will not be read.
        Keys are:
            ID_Document  ASC
        Using I/O Size  16  Kbytes for index leaf pages.
        With LRU Buffer Replacement Strategy for index leaf pages.

        FROM TABLE
            ZalyshokTMC
            ztmc
        Nested iteration.
        Index : AK_KEY_2_ZALYSHOK2
        Forward scan.
        Positioning by key.
        Keys are:
            ID_Zalyshky  ASC
        Using I/O Size  2  Kbytes for index leaf pages.
        With LRU Buffer Replacement Strategy for index leaf pages.
        Using I/O Size  2  Kbytes for data pages.
        With LRU Buffer Replacement Strategy for data pages.

        FROM TABLE
            InventoryTag
            it
        Nested iteration.
        Using Clustered Index.
        Index : PK_INVENTORYTAG
        Forward scan.
        Positioning by key.
        Keys are:
            ID_InventoryTag  ASC
        Using I/O Size  2  Kbytes for index leaf pages.
        With LRU Buffer Replacement Strategy for index leaf pages.
        Using I/O Size  2  Kbytes for data pages.
        With LRU Buffer Replacement Strategy for data pages.

        FROM TABLE
            PidrozdilFirmy
            pf
        Nested iteration.
        Using Clustered Index.
        Index : PK_PIDROZDILFIRMY
        Forward scan.
        Positioning by key.
        Keys are:
            ID_PidrozdilFirmy  ASC
        Using I/O Size  2  Kbytes for data pages.
        With LRU Buffer Replacement Strategy for data pages.

        FROM TABLE
            SalesOutlet
            so
        Nested iteration.
        Using Clustered Index.
        Index : PK_SALESOUTLET
        Forward scan.
        Positioning by key.
        Keys are:
            ID_SalesOutlet  ASC
        Using I/O Size  2  Kbytes for index leaf pages.
        With LRU Buffer Replacement Strategy for index leaf pages.
        Using I/O Size  2  Kbytes for data pages.
        With LRU Buffer Replacement Strategy for data pages.
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34409910
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в версии ASE 12.0 следующий запрос
Код: plaintext
1.
2.
declare @i int
execute ( 'select @i=555' )
select @i

давал ошибку:
Must declare variable '@i'.

но магия! в версии ASE 15 этот запрос возвращает 555!

по поводу чего в сайбейс суппорте сказали:
it's an undocumented feature added on version 12.5.4.
"We could inherit inside execute immediate variables declared in the outer scope".
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34488566
Izumov Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
(case when @TypePP is not NULL and sd.NAME="TypePP" then convert(varchar( 100 ),@TypePP) 
        when @ADSL_BC is not NULL and sd.NAME="ADSL_BC" then convert(varchar( 100 ), 
                (select ID from adm.TB_BC_List where ID_PSTNStation=IsNull(@ADSL_BC, 0 ))) 

Фишка вот в чем - даже если переменная @ADSL_BC = NULL, в CASE условие @ADSL_BC is not NULL -
Казалось бы, что при данном запросе мы не должны "зайти" в это условие, на деле оказывается наоборот ( проверено на практике ) -

Было @ADSL_BC = NULL, и при этом данный подзапрос выдавал ошибку, что пытаемся выбрать в переменную больше 1го значение, тк в таблице было несколько записей с

Код: plaintext
1.
2.
ID_PSTNStation = NULL 
(select ID from adm.TB_BC_List where ID_PSTNStation=@ADSL_BC 

Что приводило к некорретной работе всего запроса в целом…
Поэтому заменили это на след. Условие - чтобы убрать проблему с ID_PSTNStation = NULL, после чего проц. Стала работать нормально.

Код: plaintext
1.
(select ID from adm.TB_BC_List where ID_PSTNStation=IsNull(@ADSL_BC, 0 ) 

ИТОГ: Если бы вы использовали условие IF … ELSE … такого бы не произошло, а в случае с CASE будьте внимтельны, потомучто, казалось бы, изначально невалидные условия, кт не должны влиять на выборку, на самом деле могут генерить ошибку и портить конечный результат. Проверяйте подзапросы с CASE с разными входными условиями, и "оборачивайте" параметры в IsNull, как в данном случае или аналогичные, чтобы избежать возможных ошибок!

Happy Sybase bug hunting!
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34489278
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Izumov Alex пишет:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  (case when @TypePP is not NULL and sd.NAME="TypePP" then 
convert(varchar(* 100 *),@TypePP)
        when @ADSL_BC is not NULL and sd.NAME="ADSL_BC" then 
convert(varchar(* 100 *),
                  (select ID from adm.TB_BC_List where 
ID_PSTNStation=IsNull(@ADSL_BC,* 0 *)))


У вас очень сбивчевое какое-то письмо получилось.

Во-первых, CASE-выражение у вас некорректное синтаксически. Где END ?

Во-вторых, у вас нет ELSE в CASE. Если в CASE нет ELSE и ни одно условие
не соблюдается, то значение CASE-выражения - NULL. Вы пробовали добавлять в
CASE-выражение ELSE ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34489783
Izumov Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПРошу прощения у коллег, за сбивчивость. Старался описать максимально понятно %0
End для CASE есс-но в проц. есть и был... пока копировали - потерялся.
А else в данном случае не поможет... проверяли...
Вся проблема именно в том, что CASE проверяет все условия незасимо от их ВАЛИДНОСТИ.
И в нашем случае в том условии, где было FALSE и кт не должен был выполнять CASE, он его выполнял, и генерил ошибку ( изза того, что Селект возвращал более одного значения.. )
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34490203
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Izumov Alex пишет:

> Селект возвращал более одного значения.. )

Но это не ошибка. Скорее - фича. Нигде не написано, что
подзапросы в ветках, условия которых FALSE, не будут выполняться.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34494725
Izumov Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы не говорим, что ОШИБКА, мы говорим о СТРАННОСТЯХ %) Для меня такое поведение странно, тк НЕ интуитивно понятно, почему и поделился, чтобы другие не натыкались! ;) в АСЕ много таких "загадок"!
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #34505190
Фотография DimaU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наблюдал действительное такое с "count(*)"
Интересно - в будущих версиях 15... они исчезнут?
---
Всего всего! Tор-Analytics
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Странные возможности Sybase ASE
    #36664843
Еще одна странная особенность - ошибка точности

Код: plaintext
1.
2.
3.
4.
declare @a numeric( 20 , 2 ),@b numeric( 20 , 2 ), @c numeric( 20 , 2 )
select @a= 25 . 3 , @b= 3 
select @c=@a/@b
select @c

Truncation error occurred.
Command has been aborted.


Большинство других СУБД (ASA, Ms SQL, Oracle) в такой ситуации транкейтят до той точности, которую позволяет тип данных.
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #36664891
Еще один случай из практики наших коллег:


интересное поведение ASE15 в случае, если в запросе есть outer join и order by.
Вот такой тестовый пример: есть 2 таблицы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create table tstout1
(
ID numeric( 10 , 0 ) identity,
NUM_DOG varchar( 16 ) not null,
ALL_NAME varchar( 16 ) not null,
CITY numeric( 10 , 0 ) null,
constraint tsto_ID_PK primary key(ID)
)

create table tstout2
(
ID numeric( 10 , 0 ) identity,
DESCRIP varchar( 10 ) null,
constraint tsto2_ID_PK primary key(ID)
)

insert tstout2 (DESCRIP) values ('1')
insert tstout2 (DESCRIP) values ('2')

insert tstout1 (NUM_DOG,ALL_NAME,CITY) values ('10/05/01','AAAA', 1 ) 
insert tstout1 (NUM_DOG,ALL_NAME,CITY) values ('10/05/02','BBBB', 2 ) 
insert tstout1 (NUM_DOG,ALL_NAME,CITY) values ('10/05/06','FFFF', 1 ) 
insert tstout1 (NUM_DOG,ALL_NAME,CITY) values ('10/05/07','GGGG', 2 ) 
insert tstout1 (NUM_DOG,ALL_NAME) values ('10/05/12','KKKK') 
insert tstout1 (NUM_DOG,ALL_NAME) values ('10/05/13','KKKK1')

И запрос 1:

Код: plaintext
1.
2.
3.
4.
5.
select convert(int,isnull(CT.DESCRIP,'0')) as REGION,
c.NUM_DOG,max(c.ALL_NAME)
from tstout1 c
left join tstout2 CT on c.CITY=CT.ID
group by CT.DESCRIP,c.NUM_DOG
order by  1 

Он выдает результат
REGION NUM_DOG
----------- ---------------- ----------------
0 10/05/12 KKKK
0 10/05/13 KKKK1
1 10/05/01 AAAA
1 10/05/06 FFFF
2 10/05/02 BBBB
2 10/05/07 GGGG

(6 rows affected)

Если же мы добавим в запрос order by по полю внешней таблицы, которого нет в select-листе (да, я знаю, что конструкция не соответствует стандарту, но сервер ошибок не выдает), например:

Запрос 2:

Код: plaintext
1.
2.
3.
4.
5.
select convert(int,isnull(CT.DESCRIP,'0')) as REGION,
c.NUM_DOG,max(c.ALL_NAME)
from tstout1 c
left join tstout2 CT on c.CITY=CT.ID
group by CT.DESCRIP,c.NUM_DOG
order by  1 ,c.ID

то результат будет другим:
REGION NUM_DOG
----------- ---------------- ----------------
1 10/05/01 AAAA
1 10/05/06 FFFF
2 10/05/02 BBBB
2 10/05/07 GGGG

(4 rows affected)

То есть left join превратился в inner.

Что забавно, в случае Transact-sql joins:
Запрос 3:

Код: plaintext
1.
2.
3.
4.
5.
select convert(int,isnull(CT.DESCRIP,'0')) as REGION,
c.NUM_DOG,max(c.ALL_NAME)
from tstout1 c,tstout2 CT
where c.CITY*=CT.ID
group by CT.DESCRIP,c.NUM_DOG
order by  1 ,c.ID

все работает корректно.
REGION NUM_DOG
----------- ---------------- ----------------
0 10/05/12 KKKK
0 10/05/13 KKKK1
1 10/05/01 AAAA
1 10/05/06 FFFF
2 10/05/02 BBBB
2 10/05/07 GGGG

(6 rows affected)
...
Рейтинг: 0 / 0
Странные возможности Sybase ASE
    #36666955
по 18:04 горбуха - set arithabort numeric_truncation off спасает отца русской демократии
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Странные возможности Sybase ASE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]