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_no
和 batch_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_details
有 class_no
列,因此我们可以将 query1 的结果与 Global_details
连接起来,以获得最终查询中 Batch_global_Id
列的值(Query2
).
但是这里的问题是从tabletime_details
中获取Start_year
和End_year
值。我们需要根据 class_no, batch_no
.
通过 query1 获取所有记录 return 的两个字段值
这是获取这些值的条件 (Start_year, End_year
)。
如果time_details
table中有记录class_no
,我们需要从Start_year
和End_year
中获取该记录在最终输出查询中。
如果 time_details
table 中没有包含 class_no
的记录,则从中获取 Start_year
和 End_year
值在 time_details
table.
中匹配 batch_no
的记录
如果两者都不存在(在 time_details
table 中没有匹配的 class_no
& batch_no
的记录,则得到 Start_year
和 End_year
值来自 time_details
和 batch_no = null
中的记录
有人可以帮我写这个查询吗?
根据评论编辑
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_year
和 end_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 条件并排除来自第二次查询的记录。
如果能提供数据给我做测试就更好了
我知道当你的记录更多时这会导致性能问题,但你现在可以试试这个。
我有一个需要编写查询的场景。
我有一个 Query1
,其中 return 数百条记录具有基于某些连接的这四个列名称 (batch_no, batch_name, class_no, class_name
)。我需要写一个最终查询(Query2
)到来自其他 table 的 return 列,它使用 class_no
和 batch_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_details
有 class_no
列,因此我们可以将 query1 的结果与 Global_details
连接起来,以获得最终查询中 Batch_global_Id
列的值(Query2
).
但是这里的问题是从tabletime_details
中获取Start_year
和End_year
值。我们需要根据 class_no, batch_no
.
这是获取这些值的条件 (Start_year, End_year
)。
如果
time_details
table中有记录class_no
,我们需要从Start_year
和End_year
中获取该记录在最终输出查询中。如果
time_details
table 中没有包含class_no
的记录,则从中获取Start_year
和End_year
值在time_details
table. 中匹配 如果两者都不存在(在
time_details
table 中没有匹配的class_no
&batch_no
的记录,则得到Start_year
和End_year
值来自time_details
和batch_no = null
中的记录
batch_no
的记录
有人可以帮我写这个查询吗?
根据评论编辑
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_year
和 end_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 条件并排除来自第二次查询的记录。
如果能提供数据给我做测试就更好了
我知道当你的记录更多时这会导致性能问题,但你现在可以试试这个。