Очередной баг Access97 (TOP +UNION +ORDER BY)?

assa
Дата: 04.06.2004 13:07:20
Пишу:
SELECT  Null As CODE, "не опр"  AS  ORMNE, Null AS SORT  FROM ORBASE
  UNION 
SELECT ORBASE.CODE, ORBASE.ORMNE, 1 AS SORT
FROM ORBASE
ORDER BY  SORT ASC, ORMNE ;
--результат

CODE ORMNE SORT не опр 0 (слж) 1 1 000001 1 2 000002 1 3 000003 1 4 000004 1 5 Туча 1
как только TOP:
SELECT TOP 2 Null As CODE, "не опр"  AS  ORMNE, Null AS SORT  FROM ORBASE
  UNION 
SELECT ORBASE.CODE, ORBASE.ORMNE, 1 AS SORT
FROM ORBASE
ORDER BY  SORT ASC, ORMNE ;
--результат

CODE ORMNE SORT 0 (слж) 1 1 000001 1 2 000002 1 3 000003 1 4 000004 1 не опр 5 Туча 1
(TOP 2 , а не 1 - для проверки гипотезы на отключку ORDER BY для 1 записи)
но:
SELECT ORBASE.CODE, ORBASE.ORMNE, 1 AS SORT
FROM ORBASE
UNION
SELECT TOP 1 NULL AS CODE, "не опр" AS ORMNE, NULL AS SORT
FROM ORBASE
ORDER BY SORT, ORMNE;
--результат

CODE ORMNE SORT не опр 0 (слж) 1 1 000001 1 2 000002 1 3 000003 1 4 000004 1 5 Туча 1
!!- всего -то поменял местами Select-ы (трах ее тибедох)
Вроде бы всегда писал как в 1-м случае (во 2-м?), и не замечал... В 2к вообще работает только 3, если 1 - ругань на типы данных
а если 2 или так :
SELECT TOP 1  Null As CODE, "не опр"  AS  ORMNE, NULL AS SORT   FROM ORBASE
ORDER BY  NULL  , ORMNE
  UNION 
SELECT ORBASE.CODE, ORBASE.ORMNE  AS  ORMNE,clng(1) AS SORT
FROM ORBASE
(тут еще надо понять, какое из полей с Null AS ... он юзает в сортировке)
но при этом тип данных в числовых полях оченно странен - числа отображаются как "нотображаемые символы" - палки какие-та одна-две, даже для шибко больших чисел).

Кому не лень - проверьте. Мож у меня тут что не то завелось? (в джете). Или с головй что - типа "так и должен SQL работать"?
assa
Дата: 04.06.2004 13:09:56
вру: 2 - ругань (с TOP) без TOP (т.е. случай 1) - загогулины.
Roma R
Дата: 04.06.2004 13:19:44
Попоробуйте вместо Null использовать ""
assa
Дата: 04.06.2004 13:48:27
"" тут формально сойдет.(но не годится в цифирьных полях). но результат тот же - игнорирует сортировку по SORT при наличии TOP в первом запросе, и не игнорирует, если Top в последнем.
Что уже интереснее (т.к. Null еще задавал какой-то тип данных, шибко похоже что текстовый, и можно было на это как-то грешить. Мол "неясен способ сортировки").



Что интересно в явных преобразованиях и ORDER BY:
вот это выполняется
SELECT TOP 1 clng(0) As CODE,  "" AS SORT  FROM ORBASE
  UNION 
SELECT ORBASE.CODE,  "1" AS SORT
FROM ORBASE
а добавить
ORDER BY ...
и ругань - "несоответствие типов данных" (это на clng(0) - если заменить его на текст или Null, то опять работает - но поле (если по нему сортировать) будет текстовым. Для числовой сортировки придется убрать TOP - без него работает и c clng(0))

т.е. при выполнении Top + ORDER BY в UNION могут быть странности.
Alexander Say
Дата: 06.06.2004 03:02:25
SELECT TOP 2 Null As CODE, "не опр"  AS  ORMNE, Null AS SORT  FROM ORBASE
  UNION 
SELECT ORBASE.CODE, ORBASE.ORMNE, 1 AS SORT
FROM ORBASE
ORDER BY  SORT ASC, ORMNE ;
Не стоит боловаться с объединение в неопределенный тип NULL As CODE , явно описанный тип ORBASE.CODE Столбец ведь прописывается первым SELECT. Как там по правилам 1+NULL=NULL. Лучше наоборот !!!

SELECT ORBASE.CODE, ORBASE.ORMNE, 1 AS SORT
FROM ORBASE
UNION
SELECT TOP 1 NULL, "не опр", 0 
FROM ORBASE
ORDER BY SORT, ORMNE;

Это будет правильно..
асса
Дата: 07.06.2004 11:54:57
как "лучше" я и так нашел (см выше). (отсутствие CAST в диалекте или что-то в этом роде напрягает - иногда неполохо было бы при SELECT ... INTO , или в вычисляемых полях с IIF SELECT-ов - для выгрузки в Excel -они, если без бубнов, получаются Excel-ем как текстовые.).

Но проблема то существует и с "определенным типом" - а именно
SELECT TOP 1 "" AS SORT ...
UNION
...
ORDER BY SORT, ...

не сортирует по SORT (см 4 июн 04, 13:48 [722493] ) при наличии TOP в первом SELECT-е. А это баг-с. "В наилучшем виде".