SQL 服务器 - 使用 Case 或 IsNull 查询连接

SQL Server - Query Joins using Case or IsNull

我有一个需要编写查询的场景。

我有一个 Query1,其中 return 数百条记录具有基于某些连接的这四个列名称 (batch_no, batch_name, class_no, class_name)。我需要写一个最终查询(Query2)到来自其他 table 的 return 列,它使用 class_nobatch_no 列值 returned通过 Query1.

我的最终查询 (query2) 应该 return 由 query1 编辑的所有记录的这些列 return:

Batch_global_Id (in table global_details), 
batch_no, batch_name, class_no, class_name, 
Start_year, End_year (from table time_details)

Global_detailsclass_no 列,因此我们可以将 query1 的结果与 Global_details 连接起来,以获得最终查询中 Batch_global_Id 列的值(Query2).

但是这里的问题是从tabletime_details中获取Start_yearEnd_year值。我们需要根据 class_no, batch_no.

通过 query1 获取所有记录 return 的两个字段值

这是获取这些值的条件 (Start_year, End_year)。

有人可以帮我写这个查询吗?

根据评论编辑

Select 
    batch_no, batch_name, class_no, class_name 
into 
    #temptable 
from 
    ... (query1) ...

预期查询

Select 
    gd.Batch_global_Id, 
    tt.batch_no, tt.batch_name, tt.class_no, tt.class_name, 
    td.Start_year, td.End_year 
from 
    Global_details gd 
inner join 
    time_details td on gd.class_no = td.class_no 
inner join 
    **something like to get values from time_details table based on the above condition//**

如果没有示例数据,很难具体说明,但这应该能让您走上正轨。根据表的大小,首先将 select start_yearend_year 其中 batch_no is null 放入变量中,然后在合并的末尾插入这些变量可能会更快,而不是添加最后一个连接。

Select a.batch_no, a.batch_name, a.class_no, a.class_name
    , b.Batch_global_Id 
    , coalesce(c.Start_year, d.Start_year, e.Start_year) as StartYear
    , coalesce(c.End_year, d.End_year, e.End_year) as EndYear
from [Query1Results] a
left join Global_details b
on a.class_no = b.class_no
left join time_details c
on a.class_no = c.class_no
left join time_details d
on a.batch_no = d.batch_no
left join time_details e
on e.batch_no is null

请试试这个

Select 
    gd.Batch_global_Id, 
    tt.batch_no, tt.batch_name, tt.class_no, tt.class_name, 
    td.Start_year, td.End_year 
from 
    Global_details gd, time_details td, temp_table tt
where tt.class_no = gd.class_no
and tt.class_no = td.class_no

union

Select 
    gd.Batch_global_Id, 
    tt.batch_no, tt.batch_name, tt.class_no, tt.class_name, 
    td.Start_year, td.End_year 
from 
    Global_details gd, time_details td, temp_table tt
where tt.class_no = gd.class_no
and tt.batch_no = td.batch_no
and tt.class_no not in (Select tt.class_no from 
    Global_details gd, time_details td, temp_table tt
where tt.class_no = gd.class_no
and tt.class_no = td.class_no)

union 

Select 
    gd.Batch_global_Id, 
    tt.batch_no, tt.batch_name, tt.class_no, tt.class_name, 
    td.Start_year, td.End_year 
from 
    Global_details gd, time_details td, temp_table tt
where tt.class_no = gd.class_no
and td.batch_no is null
and tt.batch_no not in (Select td.batch_no 
from 
    Global_details gd, time_details td, temp_table tt
where tt.class_no = gd.class_no
and tt.batch_no = td.batch_no
and tt.class_no not in (Select tt.class_no from 
    Global_details gd, time_details td, temp_table tt
where tt.class_no = gd.class_no
and tt.class_no = td.class_no))

这是我的逻辑

我根据您的要求将查询分为三个部分

第一个查询给出符合 class_no 条件的结果

第二个查询给出 batch_no 条件并排除来自第一个查询的记录

以相同的方式第三次查询 batch_no nu 条件并排除来自第二次查询的记录。

如果能提供数据给我做测试就更好了

我知道当你的记录更多时这会导致性能问题,但你现在可以试试这个。