2015-01-03 219 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它不起作用。我猜這與前面2個子查詢有關(然後AStrTotal將它們加在一起)。

此外,是否有可能在不必使用絕對位置的情況下引用別名字段位置(對於AStrTotal爲5,以上)?

編輯:更多的背景信息...

表的主要(將被搜索主數據庫)包括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和黃芪甲甙...

Avalid AStr 
1 
2 
3 
4 
5 
6 
7 
8 
9 

領域黃芪甲甙在每個運行開始初始化爲空。 該表的第一個用途是將Ax和Ay的所有有效值存儲在字段Avalid中。第二種用途是允許用戶選擇搜索標準。爲此,將表格Afull作爲用戶搜索表單中的子表單添加。然後,用戶通過向Astr中輸入任何大於0的值 - 在要搜索的值旁輸入一個Avalid值來搜索。後來,黃芪甲甙的值(可變數字,指示強度)將在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' /'LEFT 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 

或者在outer query使用Sub Selectorder by

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

'Access'是否允許你在'ORDER BY'中使用別名,所以你可以在最後一個查詢中寫'ORDER BY ASTRTotal ASC'? – Barmar

+1

@Barmar - 我不認爲'Access'將允許在'Order By'中使用別名' –

+0

非常感謝大家的幫助。不幸的是,每當我嘗試在Order By語句中包含Select子查詢的擴展版本時,我都會收到錯誤。我在原始問題中擴展了一些內容,展示了我所嘗試的內容。 – Jim