sqlsql-serversql-order-by

How to fix incorrect syntax near keyword 'ORDER'


I've got the following SQL and it's giving me Incorrect syntax near keyword 'ORDER' when I try to execute it:

SELECT COUNT(*) AS ID 
FROM Employees i
  INNER JOIN #WeightedIDs w
  ON (i.ID = w.ID)
WHERE (i.DepartmentID = 10 and i.ShiftID = 2)

UNION ALL

SELECT i.ID FROM Employees i
  INNER JOIN #WeightedIDs w
  ON (i.ID = w.ID)
WHERE (i.DepartmentID = 10 and i.ShiftID = 2)
ORDER BY w.[Weight] ASC

How should I fix it?

UPDATE:

Here's what I'm actually trying to accomplish. I have a SPROC that is generating the query dynamically based on a bunch of different conditions. It also builds a temp table that contains ID's and weights associated with those id's so I would like the results sorted by that. Once the query is generated, I would like to get the count as well as the id's found returned in a list.


Solution

  • In a union you can only order the full result, not the partial ones because ordering a sub-select doesn't make sense - it's a relation/table and they are (by definition) not sorted.

    If you want the overal result to be ordered you can add an ORDER BY 1 ASC to sort by the first (and only) column. If you want all rows from the first part to come before the second and sort the second one by weight, you can do the following:

    select id
    from
    (
      SELECT COUNT(*) AS ID, 
             0 as sort_column
      FROM Employees i
        INNER JOIN #WeightedIDs w
        ON (i.ID = w.ID)
      WHERE (i.DepartmentID = 10 and i.ShiftID = 2)
    
      UNION ALL
    
      SELECT i.ID, 
             x.[Weight] 
      FROM Employees i
        INNER JOIN #WeightedIDs w
        ON (i.ID = w.ID)
      WHERE (i.DepartmentID = 10 and i.ShiftID = 2)
    ) x
    order by sort_column
    

    This assumes that the values for x.weight are greater than zero. If they aren't you need to use a different (lower) value in the first part of the union.