Сортировать с заявлением UNION - PullRequest
0 голосов
/ 22 января 2020

У меня небольшая проблема с оператором ORDER BY .

Вот мой запрос (извините, я знаю, что он немного длинный, но я уже много кода обрезал)

(SELECT AssAttrezzi.ID, AssBombole.matricola, CONCAT(AssBombole.matricola, ' - ', Bombole.nome) AS Descrizione 
 FROM AssAttrezzi INNER JOIN 
      AssBombole 
      ON AssBombole.matricola = AssAttrezzi.attrezzoID INNER JOIN 
      Bombole 
      ON Bombole.ID = AssBombole.tipoBombolaID 
 WHERE AssAttrezzi.cantiereID=1
) UNION
(SELECT AssAttrezzi.ID, Saldatrici.matricola,CONCAT(Saldatrici.matricola, ' - ', Saldatrici.nome) AS Descrizione 
 FROM AssAttrezzi INNER JOIN 
      Saldatrici 
      ON Saldatrici.matricola = AssAttrezzi.attrezzoID 
 WHERE AssAttrezzi.cantiereID = 1
) UNION
(SELECT AssAttrezzi.ID, AssBanchiGlad.idAtrezzo, CONCAT(AssBanchiGlad.idAtrezzo, ' - ', BanchiGladiator.nome) AS Descrizione 
 FROM AssAttrezzi INNER JOIN 
      AssBanchiGlad 
      ON AssBanchiGlad.idAtrezzo = AssAttrezzi.attrezzoID INNER JOIN
      BanchiGladiator 
      ON BanchiGladiator.ID = AssBanchiGlad.bancoID 
 WHERE AssAttrezzi.cantiereID = 1
) ORDER BY LEN(matricola), matricola

Проблема в том, что я ставлю ORDER BY в конце каждого SELECT Это дает мне ошибку:

Неправильно синтаксис вблизи UNION

Но когда я пытаюсь поставить ORDER BY в конце всего, это выдает мне еще одну ошибку:

Если ORDER Оператор BY включает оператор UNION, INTERSECT или EXCEPT, элементы инструкции должны быть указаны в списке выбора.

Что? Я хотел бы заказать *. Matricola в основном matricola для меня является важным.

Ответы [ 2 ]

1 голос
/ 22 января 2020

Попробуйте это:

(
    SELECT  AssAttrezzi.ID,
            AssBombole.matricola,
            CONCAT(AssBombole.matricola, ' - ', Bombole.nome)   AS  Descrizione,
            LEN(AssBombole.matricola)                           AS  matricola_len
    FROM    AssAttrezzi
    INNER JOIN AssBombole ON AssBombole.matricola = AssAttrezzi.attrezzoID
    INNER JOIN Bombole ON Bombole.ID = AssBombole.tipoBombolaID 
    WHERE   AssAttrezzi.cantiereID=1
)
UNION
(
    SELECT  AssAttrezzi.ID,
            Saldatrici.matricola,
            CONCAT(Saldatrici.matricola, ' - ', Saldatrici.nome)    AS  Descrizione,
            LEN(Saldatrici.matricola)                               AS  matricola_len
    FROM    AssAttrezzi
    INNER JOIN Saldatrici ON Saldatrici.matricola = AssAttrezzi.attrezzoID 
    WHERE   AssAttrezzi.cantiereID = 1
)
UNION
(
    SELECT  AssAttrezzi.ID,
            AssBanchiGlad.idAtrezzo,
            CONCAT(AssBanchiGlad.idAtrezzo, ' - ', BanchiGladiator.nome)    AS  Descrizione,
            LEN(AssBanchiGlad.idAtrezzo)                                    AS  matricola_len
    FROM    AssAttrezzi
    INNER JOIN AssBanchiGlad ON AssBanchiGlad.idAtrezzo = AssAttrezzi.attrezzoID
    INNER JOIN BanchiGladiator ON BanchiGladiator.ID = AssBanchiGlad.bancoID 
    WHERE   AssAttrezzi.cantiereID = 1
)
ORDER BY LEN(matricola),
        matricola
1 голос
/ 22 января 2020

Вы можете использовать пользовательскую сортировку:

SELECT . . . , 1 AS ID
UNION 
SELECT . . . , 2 
UNION
SELECT . . . , 3 
ORDER BY ID;

Вы не можете добавить отдельное предложение order by при использовании UNION/UNION ALL

РЕДАКТИРОВАТЬ:

SELECT AssAttrezzi.ID, AssBombole.matricola, 
       CONCAT(AssBombole.matricola, ' - ', Bombole.nome) AS Descrizione,
       LEN(matricola) AS SortLen 
FROM AssAttrezzi INNER JOIN 
     AssBombole 
     ON AssBombole.matricola = AssAttrezzi.attrezzoID INNER JOIN 
     Bombole 
     ON Bombole.ID = AssBombole.tipoBombolaID 
WHERE AssAttrezzi.cantiereID = 1 
UNION
SELECT AssAttrezzi.ID, Saldatrici.matricola,
       CONCAT(Saldatrici.matricola, ' - ', Saldatrici.nome) AS Descrizione,
       LEN(matricola) 
FROM AssAttrezzi INNER JOIN 
     Saldatrici 
     ON Saldatrici.matricola = AssAttrezzi.attrezzoID 
WHERE AssAttrezzi.cantiereID = 1 
UNION
SELECT AssAttrezzi.ID, AssBanchiGlad.idAtrezzo, 
       CONCAT(AssBanchiGlad.idAtrezzo, ' - ', BanchiGladiator.nome) AS Descrizione, 
       LEN(matricola) 
FROM AssAttrezzi INNER JOIN 
     AssBanchiGlad 
     ON AssBanchiGlad.idAtrezzo = AssAttrezzi.attrezzoID INNER JOIN
     BanchiGladiator 
     ON BanchiGladiator.ID = AssBanchiGlad.bancoID 
WHERE AssAttrezzi.cantiereID = 1
ORDER BY SortLen, matricola; 
...