2015-01-03 2 views
0

Как часть запроса я следующее (я подоконник носить обучаемый знак!) ...Заказывайте проблемы

SELECT 
    Main.Ax, 
    Main.Ay, 
    (select Astr from Afull where Avalid = Main.Ax) as AxStr, 
    (select Astr from Afull where Avalid = Main.Ay) as AyStr, 
    Switch(AxStr>=0, AxStr,AxStr<0,0,isnull(AxStr),0) 
    + Switch(AyStr>=0, AyStr,AyStr<0,0,isnull(AyStr),0) as AStrTotal 
FROM Main 

Однако, у меня есть проблема, когда я пытаюсь включить Order By 5 Asc в том, что он не работает. Я предполагаю, что это имеет какое-то отношение к двум предыдущим подзапросам (тогда AStrTotal добавляет их вместе).

Кроме того, можно ли ссылаться на позиции поля псевдонима (5, выше, для AStrTotal) без использования абсолютного положения?

EDIT: Больше фоне информации ...

Таблица Main (первичная база данных для поиска) содержит 2 поля Ax и Ay

Ax Ay 
1 6 
5 9 
3 3 
    7 
5 5 
7 2 
2 
4 4 
    3 
6 5 
7 6 

и т.д .... Пустые записи выше являются просто нулевые значения. Значения Ax и Ay могут отображаться в любом поле.

Таблица Afull содержит 2 поля, называемые Avalid и Astr ...

Avalid AStr 
1 
2 
3 
4 
5 
6 
7 
8 
9 

поле Astr инициализируется в нуль в начале каждого прогона. Первое использование этой таблицы - сохранить все допустимые значения для Ax и Ay в поле Avalid. Второе использование - это возможность выбора пользователем критерия поиска. Для этого таблица Afull добавляется как подчиненная форма в форме поиска пользователя. Затем пользователь выбирает значение Avalid для поиска, вводя любое значение> 0 в Astr - рядом со значением для поиска. В дальнейшем, значение Astr (переменное число, указывающее прочность) будет использоваться в строке запроса ORDER BY

SQL-затем построен, целью которого является вернуть все записи, несущие любую «перестановку» выбранный пользователем Avalid значения

Я теперь уменьшил первоначальный запрос к ...

SELECT 
     Main.Ax, 
     Main.Ay, 
     (select Astr from Afull where Avalid = Main.Ax) as AxStr 
FROM Main 

Затем добавляю ...

ORDER BY (select Astr from Afull where Avalid = Main.Ax) ASC; 

Но я получаю синтаксическую ошибку в ORDER BY. Удаление скобок не помогает.

+0

Вы должны быть в состоянии 'JOIN' /' ЛЕВЫЙ JOIN' (в зависимости от того, будет ли у вас всегда есть строки или нет) 'Afull', который будет _possibly_ быть более совершенным. 'MAX (...)'/'COALESCE (...)' сделает ваши намерения более очевидными, хотя я сомневаюсь, что это поможет в противном случае. –

ответ

1

скопировать весь запрос Order by

SELECT main.ax, 
     main.ay, 
     (SELECT astr FROM afull WHERE avalid = main.ax) AS AxStr, 
     (SELECT astr FROM afull WHERE avalid = main.ay) AS AyStr, 
     Switch(axstr>=0, axstr, axstr<0, 0, Isnull(axstr), 0) 
     + Switch(aystr>=0, aystr, aystr<0, 0, Isnull(aystr), 0) AS AStrTotal 
FROM main 
ORDER BY Switch(axstr>=0, axstr, axstr<0, 0, Isnull(axstr), 0) 
      + Switch(aystr>=0, aystr, aystr<0, 0, Isnull(aystr), 0) ASC 

Или используйте Sub Select и order by в outer query.

SELECT * 
FROM (SELECT main.ax, 
       main.ay, 
       (SELECT astr FROM afull WHERE avalid = main.ax) AS AxStr, 
       (SELECT astr FROM afull WHERE avalid = main.ay) AS AyStr, 
       Switch(axstr>=0, axstr, axstr<0, 0, Isnull(axstr), 0) 
       + Switch(aystr>=0, aystr, aystr<0, 0, Isnull(aystr), 0) AS 
       AStrTotal 
     FROM main) A 
ORDER BY astrtotal ASC 

даже Order by 5 Asc должны работать

SELECT main.ax, 
     main.ay, 
     (SELECT astr FROM afull WHERE avalid = main.ax) AS AxStr, 
     (SELECT astr FROM afull WHERE avalid = main.ay) AS AyStr, 
     Switch(axstr>=0, axstr, axstr<0, 0, Isnull(axstr), 0) 
     + Switch(aystr>=0, aystr, aystr<0, 0, Isnull(aystr), 0) AS AStrTotal 
FROM main 
ORDER BY 5 asc 
+0

«Доступ» позволяет использовать псевдоним в 'ORDER BY', поэтому вы можете написать' ORDER BY AStrTotal ASC' в последнем запросе? – Barmar

+1

@Barmar - Я не думаю, что 'Access' позволит использовать' alias name' в 'Order By' –

+0

Большое спасибо за помощь всем здесь. К сожалению, я получаю ошибки всякий раз, когда я пытаюсь включить расширенную версию запроса выбора Select в оператор Order By. Я немного расширил свой исходный вопрос, показывая, что я пробовал. – Jim

Смежные вопросы