Sql server 2008 使用SQL Server 2008中的两个键订购查询

Sql server 2008 使用SQL Server 2008中的两个键订购查询,sql-server-2008,Sql Server 2008,我正在尝试按两个键排序查询。查询是由几个子查询构建的。该表除了包含其他数据的列之外,还包含两列,即Key和Key。因此,我需要从SQL开始对结果进行排序,以便在报告中打印结果。这是一个例子: 钥匙父亲 4NULL 14 24 7NULL 17 二十七 如您所见,这是一个父子结构,其中一行是父子,如果Key_father为NULL,并且对于具有不同父子的每个子,Key列从一开始。 第一个子查询按顺序提供数据,因为数据存储在表中的顺序上,但第二个子查询使用group by,no。因此我尝试在第一个子

我正在尝试按两个键排序查询。查询是由几个子查询构建的。该表除了包含其他数据的列之外,还包含两列,即Key和Key。因此,我需要从SQL开始对结果进行排序,以便在报告中打印结果。这是一个例子:

钥匙父亲
4NULL
14
24
7NULL
17
二十七

如您所见,这是一个父子结构,其中一行是父子,如果Key_father为NULL,并且对于具有不同父子的每个子,Key列从一开始。 第一个子查询按顺序提供数据,因为数据存储在表中的顺序上,但第二个子查询使用group by,no。因此我尝试在第一个子查询上添加一个额外的列,该列的行号为,以保持该顺序,但第二个子查询也做了同样的事情

以下是查询:

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相同。这只是整个查询的一部分,是需要另外两个选择的子查询,我也需要保持这些选择的顺序


所以我希望有人能帮我。谢谢

这应该可以。但我不确定我是否遗漏了一个明显的简化

ORDER BY ISNULL(Key_Father,[Key]), ISNULL(Key_Father,-1),[Key]

要对结果排序,您需要在最外层的
SELECT
语句上放置一个
orderby
子句。通常不允许在嵌套的
SELECT
中使用
ORDER BY
,但即使您解决了这个问题(例如,使用
TOP
),您也不能依赖以任何特定方式对结果进行排序

如果没有orderby,结果可能会按照您想要的顺序出现,但这是不可靠的。在不同的服务器上或在将来的某个时候运行相同的查询可能会产生不同的顺序,其中统计信息、服务器负载等的差异可能会影响查询优化器实际执行语句的方式

您提供的查询部分将输出以下列。你想订哪一种

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,