little
|
|
« : 11-08-2003 11:53 » |
|
Есть запрос, формирующий результат и сортирующий его по категории, подкатегории и номеру позиции. Бывает, что подкатегория отсутствует ( is NULL), в этом случае эта строка лезет на самый верх в данной категории. Мне же нужно, чтобы она была внизу (последней в своей категории), как это сделать? SELECT tp.PriceLIstCategoryID, tpc.PriceListCategoryName, tp.PriceListSubCategoryID, tpsc.PriceListSubCategoryName, tp.ServiceID, tp.ServiceName, tp.PriceListLineNumber, tp.ServicePrice1, tp.ServicePrice2 From tblPriceList As tp, tblPriceListCategories As tpc, tblPriceListSubCategories As tpsc Where tp.PriceListCategoryID=tpc.PriceListCategoryID And )tp.PriceListSubCategoryID = tpsc.PriceListSubCategoryID: UNION ALL SELECT tp.PriceLIstCategoryID, tpc.PriceListCategoryName, tp.PriceListSubCategoryID, Null As PriceListSubCategoryName, tp.ServiceID, tp.ServiceName, tp.PriceListLineNumber, tp.ServicePrice1, tp.ServicePrice2 From tblPriceList As tp, tblPriceListCategories As tpc Where tp.PriceListCategoryID=tpc.PriceListCategoryID And )tp.PriceListSubCategoryID Is Null: Order By tp.PriceListCategoryID, tp.PriceLIstSubCategoryID, tp.PriceListLineNumber;
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #1 : 11-08-2003 12:03 » |
|
Нужно использовать чтото типа Order By tp.PriceListCategoryID, isnull(tp.PriceListSubCategoryID,100000) , tp.PriceListLineNumber;
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #2 : 11-08-2003 12:30 » |
|
Order By tp.PriceListCategoryID, isnull(tp.PriceListSubCategoryID,100000) , tp.PriceListLineNumber; Наверно все-таки ifnull()
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #3 : 11-08-2003 12:47 » |
|
Нет именно isnull. Главное чтобы слитно. is null или is not null используется в where , а isnull это функция.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
little
|
|
« Ответ #4 : 11-08-2003 13:01 » |
|
Дык, isnull имеется в Access-овском SQL или нет? Неизвестно?
Да и вообще, что она делает?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 11-08-2003 13:19 » |
|
Ну не знаю как у "вас", а у нас isnull() принимает один аргумент - вот я и подумал что ошибка. А ifnull() тут как раз вписывается. Дык, isnull имеется в Access-овском SQL или нет? Неизвестно? Попробуй - узнаешь. isnull(x) возвращает логическое значение true (или 1 - у какого как) на x равное NULL и, соотв., false (0) на NOT NULL. ifnull(x,y) - если x не равно NULL, то его же и возвращает, иначе y.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
little
|
|
« Ответ #6 : 12-08-2003 05:50 » |
|
То есть в данном случае мне предлагается вместо Null выплевывать огромное значение, которое будет заведомо больше всех имеющихся?
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #7 : 12-08-2003 06:12 » |
|
Да, или -1 и выполнять сортировку с DESC. В SQL Server(помню что у тебя акцес и не уверен что прокатит ) можно еще и так Order By tp.PriceListCategoryID,
case when tp.PriceListSubCategoryID is null then 1 else 0 end, -- создаем еще один критерий сортировки
tp.PriceListSubCategoryID , tp.PriceListLineNumber
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #8 : 12-08-2003 07:20 » |
|
case when tp.PriceListSubCategoryID is null then 1 else 0 end А вот как раз эту длинную строчку и призвана заменять ф-ия isnull() . Если, конечно, она есть в access-е... Кстати, есть ли у кого нормальная документация по access (97,2000 - хоть какая)? На msdn library нашел только мусор.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #9 : 12-08-2003 07:39 » |
|
Цитата: case when tp.PriceListSubCategoryID is null then 1 else 0 end
А вот как раз эту длинную строчку и призвана заменять ф-ия isnull() . Если, конечно, она есть в access-е...
Не совсем верно, isnull заменяет NULL осмысленым значением и только его. А здесь иметт место четкое разбиение на две группы(еще один критерий). Элегантно обходим ситуацию когда ID догонит заведомо болшее значение.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #10 : 12-08-2003 07:46 » |
|
2PSD: из твоих слов нахожу, что MSSQL и MySQL серьезно различаются. В MySQL isnull() возвращает не что попало, а 0 или 1.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #11 : 12-08-2003 08:21 » |
|
Это не MSSQL а T-SQL В MySQL isnull() возвращает не что попало, а 0 или 1.
В Т-SQL аналогом будет конструкция [поле] is [not] null и собственно это помоему из ANSY SQL 2. Но это не суть важно главное сама идея, как ее закодировать это другой вопрос.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #12 : 12-08-2003 08:46 » |
|
Выражение "IS NULL" тоже есть и используется там где положено (после ON, WHERE и т.п.), а "ISNULL()" - это ф-ий, которая также может использоваться между SELECT и FROM.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #13 : 12-08-2003 08:55 » |
|
Понятно, это я упустил из виду. В Т-TSQL аналога нет но всегда можно воспользоваться CASE.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #14 : 12-08-2003 11:25 » |
|
Диалекты...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
little
|
|
« Ответ #15 : 12-08-2003 11:35 » |
|
Сейчас испытаю case, но очень не уверен в его наличии...
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #16 : 12-08-2003 12:01 » |
|
Нет, не ведает Access о наличии case... Ну, в общем, я подставил мульён в качестве ID-шника, в данной ситуации они до него все равно никогда не доберутся. Теперь все красиво.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #17 : 12-08-2003 12:09 » |
|
Слабоват что-то access... Если пишешь на C, то порекомендую MySQL - есть такая фича как embedded server. Это когда движок сервера подключается к программе как обычная библиотека - работать можно так же как и с "обычным" сетевым сервером.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
little
|
|
« Ответ #18 : 13-08-2003 05:35 » |
|
Уж слишком дохрена там уже понаписано, чтобы переводить на C. Да и не работал я с базами из под C вообще.
|
|
|
Записан
|
|
|
|
query
Гость
|
|
« Ответ #19 : 13-08-2003 05:54 » |
|
Нет, не ведает Access о наличии case... Ну, в общем, я подставил мульён в качестве ID-шника, в данной ситуации они до него все равно никогда не доберутся. Теперь все красиво. по моему самый простой способ в Access это SELECT IIF(ISNULL(<Поле>), 100000, <поле>) ..... а в TSQL (MS SQLServer) еще проще SELECT ISNULL(<Поле>, 100000) ....
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #20 : 13-08-2003 13:02 » |
|
по моему самый простой способ в Access это SELECT IIF(ISNULL(<Поле>), 100000, <поле>) А по-моему Вы тут что-то напутали. IIF - это VB-шный оператор, которого в SQL никак не присутствует. По описаниям от MS, в Access имеется аналог ANSI SQL-89, в MS Jet 4.0 OLE DB он немного расширен и поддерживает некоторые вещи из ANSI SQL-92, многие из которых работают только для adp-проектов (т.е. в клиент серверных приложениях). Таким образом Access обычно что-то не умеет из стандартов SQL, а говорить о том, что в его SQL-е есь что-то свое (вроде IIF) тут уж не приходится.
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #21 : 14-08-2003 04:22 » |
|
Таким образом Access обычно что-то не умеет из стандартов SQL, а говорить о том, что в его SQL-е есь что-то свое (вроде IIF) тут уж не приходится.
Спорить не буду(не знаю я акцес ) но помоему в Access очень плотно сплетен SQL и VBA поэтому такой вариант(с IIF) может запросто работать как и другие VB функции.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
little
|
|
« Ответ #22 : 16-08-2003 11:32 » |
|
Нет, эта штука работает только в VBA, а также используется в значениях полей форм и отчетов, SQL же в Акцессе порезаный, а не "усиленный" Вопрос в догонку: Подключил библиотеку объектов ADO (ActiveX Data Objects), которая позволяет пользоваться более мощным SQL, чем DAO, в частности позволяет использовать хранимые процедуры (правда их не сравнить с T-SQL, но все же), виды, менять связи, управлять пользователями и разрешениями, и использовать транзакции. И вот этот кусок не делает того что я от него хочу: Public Function DropEmployee)id As Long: As Boolean Dim cmd As ADODB.Command DropEmployee = False Set cmd = New ADODB.Command cmd.ActiveConnection = CurrentProject.Connection cmd.CommandText = "Begin Transaction" On Error GoTo Sql_Error cmd.Execute cmd.CommandText = "Delete * From tblWorkDayServices Where WorkDayID In )Select WorkDayID From tblWorkDays " _ & "Where EmployeeID = " & id & ":" cmd.Execute cmd.CommandText = "Delete * From tblWorkDayLines Where WorkDayID In )Select WorkDayID From tblWorkDays " _ & "Where EmployeeID = " & id & ":" cmd.Execute cmd.CommandText = "Delete * From tblWorkDays Where EmployeeID = " & id cmd.Execute cmd.CommandText = "Delete * From tblAppointments Where EmployeeID = " & id cmd.Execute cmd.CommandText = "Delete * From tblEmployees Where EmployeeID = " & id cmd.Execute cmd.CommandText = "Commit" cmd.Execute DropEmployee = True Exit Function Sql_Error{ cmd.CommandText = "Rollback" cmd.Execute End Function Что не так?
|
|
|
Записан
|
|
|
|
little
|
|
« Ответ #23 : 19-08-2003 06:25 » |
|
Может, есть у кого какие мысли?
|
|
|
Записан
|
|
|
|
wiz
Гость
|
|
« Ответ #24 : 31-01-2006 19:17 » |
|
я сам мечтаю розобраться в загадочном SQL (особенно с "select*") и в VBA еслиб меня кто небуть розчехлил...
|
|
|
Записан
|
|
|
|
|
HandKot
Молодой специалист
Offline
|
|
« Ответ #26 : 07-02-2006 06:17 » |
|
Вопрос в догонку: Подключил библиотеку объектов ADO (ActiveX Data Objects), которая позволяет пользоваться более мощным SQL, чем DAO, в частности позволяет использовать хранимые процедуры (правда их не сравнить с T-SQL, но все же), виды, менять связи, управлять пользователями и разрешениями, и использовать транзакции. ...
Что не так?
У объекта Conection усть свои методы BeginTransaction, CommitTransaction и RollBackTransaction, т.е давать команду на выполнение cmd.CommandText = "Begin Transaction" не надо, а правильнее использовать встроенные методы
|
|
|
Записан
|
I Have Nine Lives You Have One Only THINK!
|
|
|
|