powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Волшебный запрос
25 сообщений из 26, страница 1 из 2
Волшебный запрос
    #38339975
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь Jet ругается, что в Order By указаны поля, которых нет в 1 запросе (имеет ввиду shortStreetName и fullStreetName )
Без ORDER BY всё работает нормально
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
SELECT TOP 1 -1, "<объекты без указания улицы>" AS shortStreetName, ""  AS fullStreetName, "", "", FALSE, address.settlement_id, FALSE, 0
FROM address WHERE (address.unit_id IS NOT NULL) AND (address.street_id IS NULL) AND (address.settlement_id = 20)
UNION ALL
SELECT dic_street.id, dic_street.shortName, dic_street.fullName, dic_streetType.shortName, dic_streetType.fullName, dic_street.hideType, dic_street.settlement_id, dic_street.liquidated, 0
FROM dic_street INNER JOIN dic_streetType ON (dic_street.streetType_id = dic_streetType.id)
WHERE (dic_street.settlement_id = 20)
ORDER BY IIF((shortStreetName IS NULL) OR (shortStreetName = ""), fullStreetName, shortStreetName) ASC



Вот этот работает нормально:
Код: vbnet
1.
2.
3.
4.
SELECT TOP 1 "ttttt" AS sort FROM address
UNION ALL
SELECT TOP 1 "ttttt" AS sort FROM address
ORDER BY sort





Другая проблема:
Вот здесь получаем ошибку: "Несоответствие типов данных в выражении условия отбора"
Без ORDER BY всё работает нормально. dic_street.shortName, dic_street.shortName - строки, dic_street.id - число типа Long
Код: vbnet
1.
2.
3.
4.
5.
6.
SELECT TOP 1 -1, "<объекты без указания улицы>" AS shortStreetName, ""  AS fullStreetName
FROM dic_street
UNION ALL
SELECT dic_street.id, dic_street.shortName, dic_street.fullName
FROM dic_street
ORDER BY shortStreetName ASC




P.S. Первый запрос должен стоять вверху (чисто из принципа).
...
Рейтинг: 0 / 0
Волшебный запрос
    #38339978
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И этот работает нормально:
авторSELECT TOP 1 "ttttt" AS sort FROM address
UNION ALL
SELECT "ttttt" FROM address
ORDER BY sort

Вообще у меня туева хуча запросов в коде, где в первом объединяемом запросе указываю псевдоним, а в конце выполняю по нему сортировку (ORDER BY имяПсевдонима). Никогда таких проблем не было.
...
Рейтинг: 0 / 0
Волшебный запрос
    #38340037
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё один простенький запрос. Если оставить "TOP 1", получаем ошибку "Несоответствие типов данных в выражении условия отбора".
Если убрать TOP 1, всё работает нормально.
Код: vbnet
1.
2.
3.
4.
5.
6.
SELECT TOP 1 5 AS ttt, "555" As rrr
FROM msysobjects
UNION ALL
SELECT 6, "666"
FROM msysobjects
ORDER BY rrr ASC


Снова Access в топку ? Или есть разумное объяснение ?
...
Рейтинг: 0 / 0
Волшебный запрос
    #38340058
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё один запрос. Получаем ошибку, что в ORDER BY указаны поля, отсутствующие в первом запросе.
Код: vbnet
1.
2.
3.
4.
5.
6.
SELECT 5 AS ttt, "555" As rrr
FROM msysobjects
UNION ALL
SELECT 6, "666"
FROM msysobjects
ORDER BY IIF(rrr IS NULL, ttt + 1, ttt + 2) ASC



Последние 2 запроса моделируют обе сабжевые проблемы.
И связаны последние 2 запроса только с таблицей msysobjects. Так что можете проверить в любой базе.
...
Рейтинг: 0 / 0
Волшебный запрос
    #38340080
Leran2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyrax_02,

Попробуй как подзапрос оформить:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT *
FROM
  (
    SELECT 5 AS ttt, "555" As rrr
    FROM msysobjects
    UNION ALL
    SELECT 6, "666"
    FROM msysobjects
  )
ORDER BY IIF(rrr IS NULL, ttt + 1, ttt + 2) ASC
...
Рейтинг: 0 / 0
Волшебный запрос
    #38340115
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, если поменять запросы местами или заключить во внешний запрос, возможно начнёт работать.
Только вот я хочу понять, почему не работает в исходной конструкции.

Методом тыка не программируют. Если так постоянно "пробовать", то весь процесс превратится не в процесс разработки, а в еб...ню конкретную.
...
Рейтинг: 0 / 0
Волшебный запрос
    #38340143
Leran2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyrax_02,

Попытаюсь объяснить, почему это не работает:
Если делать, без подзапроса, то получается что ты пытаешься проверить на NULL и значения, алиасы, которые еще не являются полем со значением. Ведь можно написать и так:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT 5 AS ttt, "555" As rrr
FROM msysobjects
UNION ALL
SELECT 6, "666"
FROM msysobjects
ORDER BY 2 ASC


Тут же не будешь проверять ORDER BY IIF(2 IS NULL, 1 + 1, 1 + 2) ASC

А если оформляешь все это в подзапрос, то уже будет проверяться значения столбца подзапроса, т.е. это уже не алиас.

По этой причине такая конструкция не будет работать и в других СУБД.
...
Рейтинг: 0 / 0
Волшебный запрос
    #38340298
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leran2002Cyrax_02,

Попытаюсь объяснить, почему это не работает:
Если делать, без подзапроса, то получается что ты пытаешься проверить на NULL и значения, алиасы, которые еще не являются полем со значением. Ведь можно написать и так:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT 5 AS ttt, "555" As rrr
FROM msysobjects
UNION ALL
SELECT 6, "666"
FROM msysobjects
ORDER BY 2 ASC


Тут же не будешь проверять ORDER BY IIF(2 IS NULL, 1 + 1, 1 + 2) ASC

А если оформляешь все это в подзапрос, то уже будет проверяться значения столбца подзапроса, т.е. это уже не алиас.

По этой причине такая конструкция не будет работать и в других СУБД.
Псевдонимы, указанные в первом запросе, распространяют своё действие на всё результирующее множество.
ORDER BY, указанный в самом конце, тоже распространяет своё действие на всё результирующее множество.

Следовательно, по правилам приличия ORDER BY должен придерживаться одной из следующих логик:
Либо в ORDER BY должны быть "видны" только собственные имена полей из 1-го запроса и НЕ должны быть "видны" псевдонимы
Либо в ORDER BY должны быть "видны" имена полей из 1-го запроса, у которых нет псевдонимов, и псевдонимы (при наличии). Если поле имеет псевдоним, то собственное имя не "видно", а псевдоним поля - "виден".

Какой логики придерживается Jet ? А никакой. Шалтай-балтай, блин.
В случае с единственным запросом - работает логика №2.
В случае с 2 и более запросами, объединёнными с помощью UNION, - логика №1.
...
Рейтинг: 0 / 0
Волшебный запрос
    #38340301
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПо этой причине такая конструкция не будет работать и в других СУБД.
И даже в MySQL ???
...
Рейтинг: 0 / 0
Волшебный запрос
    #38340341
Leran2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyrax_02,

Да, но здесь вы обращаетесь к псевдониму чтобы сказать что нужно сортировать по этой колонке:
Код: sql
1.
2.
SELECT 5 AS ttt, "555" As rrr FROM msysobjects UNION ALL SELECT 6, "666" FROM msysobjects
ORDER BY rrr



Что по сути эквивалентно:
Код: sql
1.
2.
SELECT 5 AS ttt, "555" As rrr FROM msysobjects UNION ALL SELECT 6, "666" FROM msysobjects
ORDER BY 2



А здесь вы пытаетесь производить с ним операции, что недопустимо:
Код: sql
1.
2.
SELECT 5 AS ttt, "555" As rrr FROM msysobjects UNION ALL SELECT 6, "666" FROM msysobjects
ORDER BY IIf(rrr Is Null,ttt+1,ttt+2)



Разница ведь есть?


авторИ даже в MySQL ???
Специально для вас проверил, не работает:
Код: sql
1.
2.
3.
4.
select 1 a, 2 b
union all
select 3,4
order by if(a=1,1,0)



А так работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select *
from
  (
    select 1 a, 2 b
    union all
    select 3,4
  )
order by if(a=1,1,0)



Понятно? )
...
Рейтинг: 0 / 0
Волшебный запрос
    #38341046
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А разве нельзя выполнять в ORDER BY операции ?
У меня куча таких запросов в программе, где я сортирую ORDER BY IIF(...) ASC - никаких проблем нет.
Т.е. операции в ORDER BY выполнять можно. Но при наличии UNION Jet почему-то начинает лажать.
...
Рейтинг: 0 / 0
Волшебный запрос
    #38341050
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что пока 1:0 в мою пользу ))
...
Рейтинг: 0 / 0
Волшебный запрос
    #38341153
Leran2002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyrax_02А разве нельзя выполнять в ORDER BY операции ?

Можно, но не над алиасами.
...
Рейтинг: 0 / 0
Волшебный запрос
    #38341243
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ok, резюме будет таким:
в ORDER BY недопустимы операции над псевдонимами

Осталось объяснить вот это поведение:
Cyrax_02Вот ещё один простенький запрос. Если оставить "TOP 1", получаем ошибку "Несоответствие типов данных в выражении условия отбора".
Если убрать TOP 1, всё работает нормально.
Код: vbnet
1.
2.
3.
4.
5.
6.
SELECT TOP 1 5 AS ttt, "555" As rrr
FROM msysobjects
UNION ALL
SELECT 6, "666"
FROM msysobjects
ORDER BY rrr ASC
...
Рейтинг: 0 / 0
Волшебный запрос
    #38341301
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT TOP 1 -1 as w0,
 "<объекты без указания улицы>" as w1,
 "<объекты без указания улицы>" AS shortStreetName,
 ""  AS fullStreetName,
 "", "", FALSE, address.settlement_id, FALSE, 0
FROM address WHERE (address.unit_id IS NOT NULL) AND (address.street_id IS NULL) AND (address.settlement_id = 20)
UNION ALL
SELECT dic_street.id as w0,
 IIF((shortStreetName IS NULL) OR (shortStreetName = ""), fullStreetName, shortStreetName) as w1,
 dic_street.shortName,
 dic_street.fullName,
 dic_streetType.shortName,
 dic_streetType.fullName,
 dic_street.hideType,
 dic_street.settlement_id,
 dic_street.liquidated, 0
FROM dic_street INNER JOIN dic_streetType ON (dic_street.streetType_id = dic_streetType.id)
WHERE (dic_street.settlement_id = 20)
ORDER BY 2
...
Рейтинг: 0 / 0
Волшебный запрос
    #38341455
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА , в Вашем варианте в выражении IIF вместо shortStreetName нужно поставить dic_street.shortName , вместо fullStreetName - dic_street.fullName . Тогда заработает. И во втором объединяемом запросе "as w1" можно убрать.

Вообще, переделать запрос так, чтобы он работал - не проблема. Можно сортировку вынести во внешний запрос, можно условие добавить как дополнительное поле и сортировать по нему (как в Вашем варианте). Только мне не это нужно. По факту, как оказалось, мне вообще не нужен ORDER BY в этом запросе.

Собственно, нужно толково объяснить вот это поведение:
Cyrax_02Вот ещё один простенький запрос. Если оставить "TOP 1", получаем ошибку "Несоответствие типов данных в выражении условия отбора".
Если убрать TOP 1, всё работает нормально.
Код: vbnet
1.
2.
3.
4.
5.
6.
SELECT TOP 1 5 AS ttt, "555" As rrr
FROM msysobjects
UNION ALL
SELECT 6, "666"
FROM msysobjects
ORDER BY rrr ASC


Здесь в предложении ORDER BY выражение не используется, тем не менее, получаем ошибку.
Ошибки не будет, если выполнить одно из следующих действий:

1. если убрать "TOP 1"
2. если вместо "ORDER BY rrr" указать "ORDER BY 2"
3. если вместо "ORDER BY rrr" указать "ORDER BY ttt"

Забавно ?
...
Рейтинг: 0 / 0
Волшебный запрос
    #38341471
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну чем ttt лучше rrr ?
...
Рейтинг: 0 / 0
Волшебный запрос
    #38341473
СхБд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cyrax_02,

ttt - некая закономерность...




мож пойдешь поспишь
...
Рейтинг: 0 / 0
Волшебный запрос
    #38341477
Фотография nord-woolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Ну чем ttt лучше rrr ?
На какое поле (в инструкции SELECT) в общем случае распространяется действие предиката TOP?
...
Рейтинг: 0 / 0
Волшебный запрос
    #38344616
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНа какое поле (в инструкции SELECT) в общем случае распространяется действие предиката TOP?
TOP относится не к полю, а к инструкции SELECT первого запроса. И действие распространяет на результирующее множество записей, возвращаемое первым запросом.
Либо мы из разных миров...
...
Рейтинг: 0 / 0
Волшебный запрос
    #38344693
Фотография nord-woolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:)
Я ожидал такой реакции.

Я к тому, что, ежели просто поменять очередность вывода полей в селекте,
Код: sql
1.
2.
3.
4.
5.
6.
SELECT TOP 1 "555" As rrr, 5 AS ttt
FROM msysobjects
UNION ALL
SELECT  "666", 6
FROM msysobjects
ORDER BY rrr ASC


то Jet уже не противится сортировке по полю rrr.
<пожимая плечами> Наверное, ему хочется первым за TOP 1 видеть поле, по которому будет ORDER BY.
...
Рейтинг: 0 / 0
Волшебный запрос
    #38345004
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выходит, Access в топку ?
...
Рейтинг: 0 / 0
Волшебный запрос
    #38345034
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Выходит, Access в топку ?
Если вопрос к сообществу нашего подфорума, то пока подождем хоронить. Лучше уж помучиться (с).
...
Рейтинг: 0 / 0
Волшебный запрос
    #38345101
Фотография nord-woolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Выходит, Access в топку ?
Вы, с завидным постоянством, уже длительное время пытаетесь "уличить" Access во всех грехах и закопать.

Он (Access-Jet-VBA) ровно такой, какой он есть , со всеми его багофичами.

Вот мне, например, не нравятся китайские/индийские/отечественные автомобили, так я на них и не езжу.
И не испытываю по этому поводу абсолютно никаких комплексов/дискомфорта.

Или взять, к примеру, мотоциклы бренда "Harley-Davidson".
И у них тоже есть свои недостатки, например, масло подтекает.
И не самые быстрые они, и не самые экономичные, и не самые "передовые" по технологиям.

И что?
Миллионы людей с удовольствием их покупают, катаются, гордятся ими, и довольны как слоны. :)

Ну уж если он вам так не мил, какого лешего вы мучаете его и себя?
...
Рейтинг: 0 / 0
Волшебный запрос
    #38349165
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторok, резюме будет таким:
в ORDER BY недопустимы операции над псевдонимами
Здесь не только это:
1. Использование в ORDER BY псевдонимов допускается только в объединённых запросах (при использовании UNION)
2. Использование в ORDER BY операций над псевдонимами НЕ допускается ни в каких запросах
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Волшебный запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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