我需要两个表之间的连接查询的过滤结果,但我没有“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
我得到了这个结果:
如何更改查询以执行此操作?
答案 0 :(得分:0)
因此,根据用户是否要求ID 24,有两个不同的查询要执行。
以下是ID 24的查询:
select *
from tag_project
where id_project = 24;
以下是@OTHERID的查询。我们使用UNION ALL将24条记录与@OTHER记录组合在一起。我们使用NOT EXISTS以避免某些记录。
select *
from tag_project
where id_project = @OTHERID
union all
select *
from tag_project tp
where id_project = 24
and not exists
(
select *
from tag_project tp2
where tp2.id_tag = tp.id_tag
and tp2.id_project = @OTHERID
);
答案 1 :(得分:0)
更多地考虑一下你的请求,它可以归结为:每个id_tag都会给我一个ID,如果没有,则为24。这可以在一个查询中完成,您可以在其中使用ROW_NUMBER的排名,其中您更喜欢24个请求的ID。
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;
答案 2 :(得分:0)
使用in
:
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
and tp.id_project in (24, @OTHERID)
<强>更新强> 如果您只想要一个id_project,则use也可以使用聚合方法。
SELECT tp.id_tag, tp.NJTagName, tp.node_level , tl.id_level
case when count(distinct tp.id_project) = 2 then @OTHERID
else 24 end as id_project
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, @OTHERID)
GROUP BY tp.id_tag, tp.NJTagName, tp.node_level , tl.id_level
答案 3 :(得分:0)
你可以这样写默认情况下传递@otherId为NULL
。
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 AND tp.id_project = ISnull(@otherId, 24)