条件where子句

时间:2015-06-24 09:11:02

标签: sql sql-server inner-join

我需要两个表之间的连接查询的过滤结果,但我没有“where子句”的条件。

我需要的是基于id_project进行过滤,如下所示:

  1. 如果id_project等于24 (24是默认项目)那么它应该只返回包含 id_project = 24。 此处将选择行1,3 ... 10

  2. 如果id_project等于25,那么我需要那些id_project = 25的行以及那些具有“id_project = 24而不是id_project 25,的行,因此将选择行号2到11 < /强>

  3. 使用此查询:

    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 
    

    我得到了这个结果:

    enter image description here

    如何更改查询以执行此操作?

4 个答案:

答案 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)