Заказать запрос с двумя ключами SQL Server 2008 - PullRequest
0 голосов
/ 16 августа 2010

Я пытаюсь заказать запрос по двум ключам.Запрос построен с несколькими подзапросами.Таблица содержит, кроме столбцов с другими данными, два столбца, Key и Key_Father.Поэтому мне нужно упорядочить результаты начиная с SQL, чтобы распечатать результаты в отчете.Это пример:

Key Key_Father
4 NULL
1 4
2 4
7 NULL
1 7
2 7

AsВы можете видеть структуру отца-сына, где строка является отцом, если Key_Father равен NULL, а столбец Key начинается с единицы для каждого сына с другим отцом.Первый подзапрос дает данные по порядку, потому что они хранятся в таблице в указанном порядке, а второй подзапрос, использующий группу, - нет.Поэтому я попытался добавить дополнительный столбец с Row_Number в первом подзапросе, чтобы сохранить этот порядок, но второй подзапрос делает то же самое.

Это запрос:

SELECT Orden,INV_Key,Key_Padre,INV.INV_ID,INV.BOD_Bodega_ID,
CASE WHEN MAX(HIS_Ventas) > 0 OR max(HIS_Disponible) > 0 THEN 1 ELSE 0 END AS Participacion,MAX(ISNULL(HIS_Ventas,0)) AS Ventas
FROM(SELECT ROW_NUMBER() OVER (ORDER BY C.INV_Compra_ID) Orden,C.BOD_Bodega_ID,INV_Key,Key_Padre,CD.INV_ID
FROM dbo.INV_COMPRAS_USADOS C
INNER JOIN dbo.INV_COMPRAS_USADOS_DET CD ON C.INV_Compra_ID = CD.INV_Compra_ID
WHERE C.INV_Compra_ID = @Compra_ID
AND ((Key_Padre IS NULL AND CD.INV_Catalogo_Codigo = ISNULL(@Cod_Catalogo,CD.INV_Catalogo_Codigo)
AND INV_Key IN (SELECT DISTINCT Key_Padre
FROM dbo.INV_COMPRAS_USADOS_DET
WHERE INV_Compra_ID = @Compra_ID AND Key_Padre IS NOT NULL))
OR Key_Padre IN (SELECT DISTINCT INV_Key
FROM dbo.INV_COMPRAS_USADOS_DET
WHERE INV_Compra_ID = @Compra_ID AND (Key_Padre IS NULL AND CD.INV_Catalogo_Codigo = ISNULL(@Cod_Catalogo,CD.INV_Catalogo_Codigo))))) INV
LEFT JOIN DBO.HIS_HISTORICO_DETALLE HD ON INV.INV_ID = HD.INV_ID AND HD.BOD_Bodega_ID = INV.BOD_Bodega_ID
LEFT JOIN DBO.HIS_HISTORICO_INVENTARIO H on H.HIS_Historico_ID= HD.HIS_Historico_ID AND (CONVERT(datetime,(convert(varchar(20),HIS_Historico_Ano) + '/' + convert(varchar(20),HIS_Historico_Mes) + '/01')) BETWEEN @FechaDesde AND @FechaHasta)
WHERE H.HIS_Historico_Mes IS NOT NULL OR INV.INV_ID IS NULL
GROUP BY Orden,INV_Key,Key_Padre,INV.INV_ID,INV.BOD_Bodega_ID,HIS_Historico_Ano,HIS_Historico_Mes

Еще одна интересная вещь(хорошо для меня): когда я изменяю значения @Variables для констант, второй запрос сохраняет правильный порядок, даже если значения констант совпадают с значениями @variables.Это всего лишь часть общего запроса, это подзапрос, который требует еще двух выборок, и мне нужно также сохранить порядок этих выборок.

Поэтому я надеюсь, что кто-то может помочь мне с этим.Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 августа 2010

Чтобы упорядочить результаты, вам нужно поместить предложение ORDER BY в external SELECT.Использование ORDER BY во вложенном SELECT обычно недопустимо, но даже если вы обходите его (например, используя TOP), вы не можете полагаться на результаты, упорядоченные каким-либо конкретным способом.

Без ORDER BY результаты могут показаться в нужном вам порядке, но на это нельзя полагаться.Выполнение одного и того же запроса на другом сервере или в будущем может привести к другому порядку, в котором различия в статистике, нагрузке на сервер и т. Д. Могут повлиять на то, как оптимизатор запросов фактически выполняет оператор.

ЧастьВаш запрос выводит следующие столбцы.Какие из них вы хотите заказать?

Orden (although this is just an alias for INV_Compra_ID as far as orderin is concerned)
INV_Key
Key_Padre
INV_ID
BOD_Bodega_ID
Participacion
Ventas

Допустим, вы хотите сделать заказ только по одному из них, затем вам нужно добавить следующий пункт к самому внешнему SELECT:

ORDER BY
    Orden,
    INV_Key,
    Key_Padre,
0 голосов
/ 16 августа 2010

Это должно сделать это.Я не уверен, что мне не хватает очевидного упрощения.

ORDER BY ISNULL(Key_Father,[Key]), ISNULL(Key_Father,-1),[Key]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...