2012-02-23 64 views
2

好吧我有一個特別討厭的聯合訂購問題,所以我們將不勝感激。在MS Access中訂購聯合查詢SQL

的情況是這樣的:

成員表與以下記錄(實際數據):

REI882 
YUI987 
POBO37 
NUBS26 
BTBU12 
MZBY10 
TYBW54 

(這些在順序列出我希望他們從我的查詢回來。)

關於這些MemberID的構建有許多業務規則,我認爲這些與這種無關。它們具有歷史意義並且堅如磐石。我困在他們身邊。他們表示會員的資歷。

順序是從最後4個字符的ID完成,上行。就類別而言,ID的前兩個字符完全沒有意義。

所以最上面可能記錄是?? A001(最高級)和可能的最低記錄是?? ZZ99(至少高級)。

當我查詢我的成員表中的名單,我回去必須顯示最高級的頂部......顯然,一個標準的排序不起作用。這是我迄今:

其中第一個查詢與排序成員的ID只有1個字母交易。第二個涉及那些有2個主要字母的人。

SELECT * FROM (

    SELECT Member.ID 
    FROM Member 
    WHERE (((IsNumeric(Mid([Member.ID],4,1)))=-1)) **check the 4th character is a digit 
    ORDER BY (Mid([Member.ID],3,1)), (Mid([Member.ID],4,1)), (Mid([Member.ID],5,1)), (Mid([Member.ID],6,1)) 
) t1 

UNION 

SELECT * FROM (
    SELECT Member.ID 
    FROM Member 
    WHERE (((IsNumeric(Mid([Member.ID],4,1)))=0)) **check the 4th character is a letter 
    ORDER BY (Mid([Member.ID],3,1)), (Mid([Member.ID],4,1)), (Mid([Member.ID],5,1)), (Mid([Member.ID],6,1)) 
) t2 

但是我得到了與聯盟的瘋狂結果!如果我單獨運行每個選擇 - 沒有問題,我的時髦(嚴重依賴訪問中的一些討厭的字符串操作!)排序完全按照我的要求工作。

我明白這是相當複雜的,但我希望我已經清楚地解釋它,有人是因爲某些榮譽爲計算出來!

編輯:從我的查詢結果是看似隨意:

YUI987 
MZBY10 
NUBS26 
BTBU12 
REI882 
POBO37 
TYBW54 
+0

我有一個類似的問題在那裏我有另一個程序不斷插入時間,當有人完成做什麼的,反正我格式化的ToString日期時間(「MM/DD/YYYY HH:MM/SS TT「)意外,如果你會發現有其中一個破折號‘:’是假設,反正現在我固定它,當我去對它進行排序#%$的,因爲某些字段都沒有!以正確的格式,我想,使其能夠根據時間來排序 – 2012-04-23 15:20:28

+0

我的問題是幾乎完全一樣,因爲這問題;因爲我加了一個賞金我還不如給一些細節,使目前給出的答案 – 2012-04-23 15:46:36

回答

0

你爲什麼不使用RIGHT功能。

喜歡的東西

SELECT ID 
FROM (
      SELECT ID 
      FROM (
         SELECT Member.ID 
         FROM Member 
         WHERE (((IsNumeric(Mid([Member.ID],4,1)))=-1)) **check the 4th character is a digit 
        ) t1 
      UNION 
      SELECT ID 
      FROM (
         SELECT Member.ID 
         FROM Member 
         WHERE (((IsNumeric(Mid([Member.ID],4,1)))=0)) **check the 4th character is a letter 
        ) t2 
     ) t3 
ORDER BY RIGHT(ID,4) 
+0

由於不足......更清潔的排序...但它給了我一模一樣的錯誤的結果是我原來的解決方案,我只是想通。 'YUI987 MZBY10 NUBS26 BTBU12 REI882 POBO37 TYBW54' – Kenilik 2012-02-23 11:55:07

+1

我有2個表測試了這個和AFTER工會已經創作的作品使用的順序。您在此使用的ORDER BY是否從實際版本中略微淡化? – 2012-02-23 12:32:28

0

如何跳過UNION?

SELECT members.ID 
FROM members 
ORDER BY Right([ID],3), Right(id,4) 

根據新規則,這個混亂可能會奏效。

SELECT 
    Len(IIf([textId] Like "[a-z][a-z][0-9][0-9][0-9][0-9]",Left([textid],2), 
    IIf([textId] Like "[a-z][a-z][a-z][0-9][0-9][0-9]",Left([textid],3), 
    IIf([textId] Like "[a-z][a-z][a-z][a-z][0-9][0-9]",Left([textid],4),"_")))) AS Ln, 

    IIf(textId Like "[a-z][a-z][0-9][0-9][0-9][0-9]",Left(textid,2), 
    IIf(textId Like "[a-z][a-z][a-z][0-9][0-9][0-9]",Left(textid,3), 
    IIf(textId Like "[a-z][a-z][a-z][a-z][0-9][0-9]",Left(textid,4),"_"))) AS Alpha, 

    IIf(textId Like "[a-z][a-z][0-9][0-9][0-9][0-9]",Val(Right(textid,4)), 
    IIf(textId Like "[a-z][a-z][a-z][0-9][0-9][0-9]",Val(Right(textid,3)), 
    IIf(textId Like "[a-z][a-z][a-z][a-z][0-9][0-9]",Val(Right(textid,2)),0))) AS Numbr, 

    table.textid 
FROM table 
ORDER BY 
    Len(IIf([textId] Like "[a-z][a-z][0-9][0-9][0-9][0-9]",Left([textid],2), 
    IIf([textId] Like "[a-z][a-z][a-z][0-9][0-9][0-9]",Left([textid],3), 
    IIf([textId] Like "[a-z][a-z][a-z][a-z][0-9][0-9]",Left([textid],4),"_")))), 

    IIf(textId Like "[a-z][a-z][0-9][0-9][0-9][0-9]",Left(textid,2), 
    IIf(textId Like "[a-z][a-z][a-z][0-9][0-9][0-9]",Left(textid,3), 
    IIf(textId Like "[a-z][a-z][a-z][a-z][0-9][0-9]",Left(textid,4),"_"))), 

    IIf(textId Like "[a-z][a-z][0-9][0-9][0-9][0-9]",Val(Right(textid,4)), 
    IIf(textId Like "[a-z][a-z][a-z][0-9][0-9][0-9]",Val(Right(textid,3)), 
    IIf(textId Like "[a-z][a-z][a-z][a-z][0-9][0-9]",Val(Right(textid,2)),0))) 
+0

美麗!!!!!哦,這麼血腥的簡單......爲什麼一旦我開始複雜的路徑,我無法找到回頭路! – Kenilik 2012-02-24 03:06:48

+1

這個答案似乎一直未被接受,很高興知道爲什麼以備將來參考。 – Fionnuala 2012-03-02 09:43:49

+0

不幸的是它不起作用。我從原始問題陳述中留下了一些樣本數據(仍然符合公佈的業務規則)。當我將真實數據放入應用程序時,排序不能按預期工作。我改變了我的應用程序的設計,所以我不再需要這種類型。如果你有興趣的樣本數據排序是:AA0001; ZZ9999; AAA001; ZZZ999; AAAA01; ZZZZ99 - 這是正確的順序我希望從任何查詢回一個ID。我懷疑我必須編寫一個自定義過程來實現這種類型。 – Kenilik 2012-03-21 07:46:01

1

SELECT聲明ORDER BYUNION與另一SELECT是不正確的。

指定條件定單here

您可以使用此:

SELECT ID FROM( 
(SELECT Member.ID,1 AS T,Left([Member.ID],2) AS Part1, Right([Member.ID],4) AS Part2 
    FROM Member 
    WHERE (((IsNumeric(Mid([Member.ID],3,1)))=-1)))  
UNION  
    (SELECT Member.ID,2 AS T,Left([Member.ID],3) AS Part1, Right([Member.ID],3) AS Part2 
    FROM Member 
    WHERE (((IsNumeric(Mid([Member.ID],4,1)))=-1) and ((IsNumeric(Mid([Member.ID],3,1)))=0)))  
UNION  
    (SELECT Member.ID,3 AS T,Left([Member.ID],4) AS Part1, Right([Member.ID],2) AS Part2 
    FROM Member 
    WHERE (((IsNumeric(Mid([Member.ID],5,1)))=-1) and ((IsNumeric(Mid([Member.ID],4,1)))=0)))  

ORDER BY T,Part1,Part2) 

@Justin柯克:我不知道什麼是你的問題完全一樣。但我希望它可以幫助你