Sql 获取指定列值的最高主键
我有一个查询,应该为特定请求代码提取最高的主键id:Sql 获取指定列值的最高主键,sql,sql-server,Sql,Sql Server,我有一个查询,应该为特定请求代码提取最高的主键id: SELECT id FROM [QTRA410].[Admin].[qt_request] WHERE id IN (SELECT Max(id) FROM [QTRAX4619410].[QTRAXAdmin].[qt_request]) AND requestcode = 'FOREMAN'; 以下是表中的当前数据: 但是,查询根本没有返回任何内容,我不明白为什么: 奇怪
SELECT id
FROM [QTRA410].[Admin].[qt_request]
WHERE id IN (SELECT Max(id)
FROM [QTRAX4619410].[QTRAXAdmin].[qt_request])
AND requestcode = 'FOREMAN';
以下是表中的当前数据:
但是,查询根本没有返回任何内容,我不明白为什么:
奇怪的是,当我搜索请求代码“JOB”时,它工作正常:
试试这个:
SELECT id
FROM [QTRA410].[Admin].[qt_request]
WHERE id IN (SELECT Max(id)
FROM [QTRAX4619410].[QTRAXAdmin].[qt_request]
WHERE requestcode = 'FOREMAN')
你的两个条件是取消资格id 40。对于Max(id)的子选择每次返回42。您的requestcode条件要求requestcode=“FOREMAN”。没有id为42的“FOREMAN”请求代码。您的子选择未被请求代码过滤。我想你想要像这样的东西
SELECT id
FROM [QTRA410].[Admin].[qt_request]
WHERE id IN (SELECT Max(id)
FROM [QTRAX4619410].[QTRAXAdmin].[qt_request]
AND requestcode = 'FOREMAN')
;
或
如果[QTRAX4619410].[QTRAXAdmin].[qt_请求]操作系统不包含请求代码,也可以尝试:
SELECT id
FROM [QTRA410].[Admin].[qt_request]
WHERE id IN (SELECT Max(r1.id)
FROM [QTRAX4619410].[QTRAXAdmin].[qt_request] r1
join [QTRA410].[Admin].[qt_request] r2 on r1.id = r2.id
AND r2.requestcode = 'FOREMAN')
我会这样写:
with cte as (
SELECT id
, row_number() over (partition by reqeustcode order by id desc) as rn
FROM [QTRAX4619410].[QTRAXAdmin].[qt_request]
)
select *
from cte
where rn = 1
and requestcode = 'FOREMAN'
本质上,您是按每个请求代码的id降序枚举行,然后选择第一个(即最大的)。优化器可以很好地优化它,但你这样想不会错。为什么它“奇怪”?,
id=42
有一个RequestCode='JOB'
,从上面的表数据可以看出,FOREMAN应该返回40,但它什么也不返回。然而,正如预期的那样,工作返回42。也许“FOREMAN”实际上是“FOREMAN”(见空格)。请检查[RequestCode]列中的实际值。@davidtunell这是因为您在子查询之外使用了RequestCode='FOREMAN'
,您应该在子查询内部使用它。最初的逻辑是,max id必须是FOrman的请求代码,而不是与max id关联的请求代码。这实际上更有用。
with cte as (
SELECT id
, row_number() over (partition by reqeustcode order by id desc) as rn
FROM [QTRAX4619410].[QTRAXAdmin].[qt_request]
)
select *
from cte
where rn = 1
and requestcode = 'FOREMAN'