我需要两个表之间的联接查询的过滤结果,但没有“ where子句”的条件。
我需要的是基于id_project进行过滤,如下所示:
如果id_project等于24 (默认项目为24 ),则它应仅返回id_project = 24的行。在这里将选择行1,3 ... 10
如果id_project等于25,那么我需要具有id_project = 25的行以及具有“ id_project = 24而不是id_project 25的行,因此将选择2至11行
使用此查询:
SELECT tp.id_tag, tp.id_project, tp.NJTagName, tp.node_level , tl.id_level
FROM instrumentation.dbo.tag_project tp
INNER JOIN instrumentation.dbo.tag_level tl
ON tl.id_tag=tp.id_tag
//
where tl.id_level=69 and tp.node_level=1
我得到这个结果:
如何更改查询以执行此操作?
想一想有关您的请求的更多信息,可以归结为:对于每个id_tag,请给我提供所请求的ID;如果不提供ID,则为24。这可以在一个查询中完成,在该查询中,您使用ROW_NUMBER的排名,在该排名中,您希望使用请求的ID而不是24。
select *
from
(
select
tp.*,
row_number() over(partition by id_tag
order by case when id_project = 24 then 2 else 1 end) as rn
from tag_project tp
where id_project in (24, @REQUESTED_ID)
) ranked
where rn = 1;
这是您原来的查询已相应更改:
SELECT id_tag, id_project, NJTagName, node_level, id_level
FROM
(
SELECT tp.id_tag, tp.id_project, tp.NJTagName, tp.node_level , tl.id_level
, row_number() over (partition by tp.id_tag order by case when tp.id_project = 24 then 2 else 1 end) as rn
FROM instrumentation.dbo.tag_project tp
INNER JOIN instrumentation.dbo.tag_level tl ON tl.id_tag=tp.id_tag
WHERE tl.id_level=69 AND tp.node_level=1
AND tp.id_project in (24, @REQUESTED_ID)
) ranked
WHERE rn = 1;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句