Что может создать синтаксическую ошибку, если вы берете SQL-запрос и выполняете UNION с самим собой? - PullRequest
2 голосов
/ 31 августа 2010

У меня есть эта странная ошибка в SQL Server 2005, где я беру рабочий запрос, добавляю ключевое слово UNION под ним, а затем снова копирую запрос. На мой взгляд, это всегда должно работать, но это не так. Я получаю сообщение "Неверный синтаксис рядом с ключевым словом" союз ".

Что может создать эту проблему?

Чтобы быть более конкретным, вот полный запрос:

select distinct deliveries.id, orders.id, 20 + sum(orders.mass1) as allowed_duration 
from features_resources  
inner join features on features.id = featureid 
inner join orders on orders.id = features_resources.resourceid 
inner join orderinformations on orders.id = orderinformations.orderid
inner join deliveries on orderinformations.deliveryid = deliveries.id
where features.name = 'O_FRAIS'
and     (deliveries.ID IN
                      (SELECT     ID
                        FROM          dbo.DeliveriesInExportedSchedule))

group by deliveries.id, features.name ,orders.id order by deliveries.id
union
select distinct deliveries.id, orders.id, 20 + sum(orders.mass1) as allowed_duration 
from features_resources  
inner join features on features.id = featureid 
inner join orders on orders.id = features_resources.resourceid 
inner join orderinformations on orders.id = orderinformations.orderid
inner join deliveries on orderinformations.deliveryid = deliveries.id
where features.name = 'O_FRAIS'
and     (deliveries.ID IN
                      (SELECT     ID
                        FROM          dbo.DeliveriesInExportedSchedule))

group by deliveries.id, features.name ,orders.id order by deliveries.id 

Я пытался воспроизвести ошибку в меньшем запросе, начиная с простого запроса и добавляя функции по одному (внутреннее объединение, вложенные запросы, группировка по сумме, ....), но не смог воспроизвести ошибку снова.

Есть идеи?

Ответы [ 2 ]

9 голосов
/ 31 августа 2010

Проблема на самом деле order by deliveries.id в верхней половине.

order by необходимо применить ко всему запросу.

Пример синтаксиса

SELECT v1.number
FROM   master.dbo.spt_values v1
WHERE  v1.number > 2000

UNION

SELECT   v2.number
FROM     master.dbo.spt_values v2
WHERE    v2.number < 10
ORDER BY v1.number
1 голос
/ 31 августа 2010

Попробуйте поставить отдельных SELECT s в скобках:

(SELECT ... )
UNION
(SELECT ... )

Как у вас сейчас, вторые предложения WHERE и GROUP BY неоднозначны - должно ли это применяться к SELECT или UNION? Я не могу сказать, как и ваш сервер БД.

...