Порядок запроса объединения в MS Access SQL - PullRequest
2 голосов
/ 23 февраля 2012

ОК У меня особенно неприятная проблема с порядком в профсоюзах, поэтому любая помощь будет признательна.

Сценарий таков:

Таблица членов со следующими записями (фактические данные):

REI882
YUI987
POBO37
NUBS26
BTBU12
MZBY10
TYBW54

(Они перечислены в том порядке, в котором я хочу вернуть их из моего запроса.)

Существует ряд бизнес-правил, касающихся создания этих MemberID, которые, я считаю, не имеют отношения к этому типу. Они исторические и каменные. Я застрял с ними. Они указывают на трудовой стаж члена.

Упорядочение производится по последним 4 символам в ID по возрастанию. Первые два символа идентификатора совершенно бессмысленны для сортировки.

Таким образом, самая верхняя возможная запись - A001 (самая старшая), а самая низкая возможная запись - ZZ99 (младший старший).

Когда я запрашиваю свою таблицу участников, список, который я получаю, должен отображать самое старшее сверху ... Очевидно, что стандартная сортировка не работает. Это то, что я должен на сегодняшний день:

Первый из этих запросов касается членов сортировки, чей идентификатор содержит только 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

Но я получаю СУМАСШЕДШИЕ результаты с профсоюзом! Если я запускаю каждый из селекторов по отдельности - нет проблем, моя фанковая сортировка (в большой степени зависящая от некоторых неприятных манипуляций со строками в доступе!) Работает именно так, как я хочу.

Я понимаю, что это довольно сложно, но я надеюсь, что я объяснил это ясно, и что кто-то хочет почтить его за это !!!

edit: результат моего запроса выглядит случайным:

YUI987
MZBY10
NUBS26
BTBU12
REI882
POBO37
TYBW54

Ответы [ 3 ]

1 голос
/ 24 апреля 2012

ORDER BY в операторе SELECT о том, что UNION с другим SELECT неверно.

См. Указание условного заказа здесь

Вы можете использовать это:

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)

@ Джастин Кирк: Я не знаю, в чём именно твоя проблема. Но я надеюсь, что это может помочь вам

0 голосов
/ 23 февраля 2012

Как насчет пропустить 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 голосов
/ 23 февраля 2012

Почему вы не используете функцию ВПРАВО .

Что-то вроде

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)
...