UNION ALL之前的语句中的ORDER BY

时间:2017-12-07 13:50:50

标签: sql sql-server

我有这个问题:

SELECT DISTINCT 
    CAST([SV_USLUGA_DRZAVA].[ID_DRZAVE] AS varchar) AS ID,
    CONCAT([SIF_DRZAVE].NAZIV_DRZAVE,' - ',CAST([SV_USLUGA_DRZAVA].[ID_DRZAVE] AS varchar),' - Zona I')  AS NAZIV
FROM 
    [dbo].[SV_USLUGA_DRZAVA]
FULL OUTER JOIN 
    [SIF_DRZAVE] ON ([SV_USLUGA_DRZAVA].[ID_DRZAVE]=[SIF_DRZAVE].[ID_DRZAVE]) 
WHERE 
    [SV_USLUGA_DRZAVA].SIF_VRSTA_USLUGA = 139 
    AND ([SV_USLUGA_DRZAVA].ID_DRZAVE = 295 
         OR [SV_USLUGA_DRZAVA].ID_DRZAVE = 293)

UNION ALL

SELECT DISTINCT 
    CAST([SV_USLUGA_DRZAVA].[ID_DRZAVE] AS varchar) AS ID,
    CONCAT([SIF_DRZAVE].NAZIV_DRZAVE,' - ',CAST([SV_USLUGA_DRZAVA].[ID_DRZAVE] AS varchar),' - Zona II') AS NAZIV 
FROM 
    [dbo].[SV_USLUGA_DRZAVA]
FULL OUTER JOIN 
    [SIF_DRZAVE] ON ([SV_USLUGA_DRZAVA].[ID_DRZAVE]=[SIF_DRZAVE].[ID_DRZAVE]) 
WHERE 
    [SV_USLUGA_DRZAVA].SIF_VRSTA_USLUGA = 139 
    AND NOT ([SV_USLUGA_DRZAVA].ID_DRZAVE = 295 
             OR [SV_USLUGA_DRZAVA].ID_DRZAVE = 293)
ORDER BY 
    NAZIV

此查询按'NAZIV'整个声明后的顺序排序。

但我希望在UNION ALL

之前通过'NAZIV'进行查询

2 个答案:

答案 0 :(得分:1)

您的查询有很多问题。我想这就是你想要的:

SELECT distinct Cast(ud.[ID_DRZAVE] as varchar(255)) as ID,
       CONCAT(d.NAZIV_DRZAVE, ' - ',
              Cast(ud.[ID_DRZAVE] as varchar(255)),
              (CASE WHEN ud.ID_DRZAVE IN (295, 293) THEN ' - Zona I' ELSE ' - Zona II' END)
             ) as NAZIV
FROM [dbo].[SV_USLUGA_DRZAVA] ud JOIN
     [SIF_DRZAVE] d 
     ON ud.[ID_DRZAVE] = d.[ID_DRZAVE]
WHERE d.SIF_VRSTA_USLUGA = 139 
ORDER BY (CASE WHEN ud.ID_DRZAVE IN (295, 293) THEN 1 ELSE 0 END),
         NAZIV;

注意:

  • FULL JOIN条款正在取消WHERE。使用适当的JOIN
  • 使用IN而不是链接OR条件。
  • 永远不要在SQL Server中使用VARCHAR()没有长度。默认长度因上下文而异,调试此问题可能非常具有挑战性。
  • 表别名使查询更易于编写和阅读。
  • 根据您的目标,您根本不需要UNION / UNION ALL

答案 1 :(得分:0)

添加另一列,以便获得所需的订单:

SELECT DISTINCT 
    '1' AS ZONA,
    CAST([SV_USLUGA_DRZAVA].[ID_DRZAVE] AS varchar) AS ID,
    CONCAT([SIF_DRZAVE].NAZIV_DRZAVE,' - ',CAST([SV_USLUGA_DRZAVA].[ID_DRZAVE] AS varchar),' - Zona I')  AS NAZIV
FROM 
    [dbo].[SV_USLUGA_DRZAVA]
FULL OUTER JOIN 
    [SIF_DRZAVE] ON ([SV_USLUGA_DRZAVA].[ID_DRZAVE]=[SIF_DRZAVE].[ID_DRZAVE]) 
WHERE 
    [SV_USLUGA_DRZAVA].SIF_VRSTA_USLUGA = 139 
    AND ([SV_USLUGA_DRZAVA].ID_DRZAVE = 295 
        OR [SV_USLUGA_DRZAVA].ID_DRZAVE = 293)
UNION ALL
SELECT DISTINCT 
    '2',
    CAST([SV_USLUGA_DRZAVA].[ID_DRZAVE] AS varchar) AS ID,
    CONCAT([SIF_DRZAVE].NAZIV_DRZAVE,' - ',CAST([SV_USLUGA_DRZAVA].[ID_DRZAVE] AS varchar),' - Zona II') AS NAZIV 
FROM 
    [dbo].[SV_USLUGA_DRZAVA]
FULL OUTER JOIN 
    [SIF_DRZAVE] ON ([SV_USLUGA_DRZAVA].[ID_DRZAVE]=[SIF_DRZAVE].[ID_DRZAVE]) 
WHERE 
    [SV_USLUGA_DRZAVA].SIF_VRSTA_USLUGA = 139 
    AND NOT ([SV_USLUGA_DRZAVA].ID_DRZAVE = 295 
         OR [SV_USLUGA_DRZAVA].ID_DRZAVE = 293)
ORDER BY 
    ZONA, NAZIV