SQL 查询 table,每个 ID 多行,每个 ID 输出单行
SQL Query for table with multiple rows per ID outputting single row per ID
这让我有点头疼。我已经简化了 tables 并添加了一个示例场景来帮助理解上下文。我需要在 SQL 服务器中编写一个查询,它将通过中心的引用 table 使用第一个 table 中的数据在第三个 table 中输出结果.我在编写 SQL 查询方面不是很聪明(但肯定会变得更好),所以您能为我提供的任何帮助都会很棒! table如下:
下面是数据table可能包含
单个身份的一个和三个条目。
┌────────┬──────────────────┐
│Identity│Partial_Identifier│
├────────┼──────────────────┤
│100 │a │
├────────┼──────────────────┤
│100 │b │
├────────┼──────────────────┤
│100 │c │
├────────┼──────────────────┤
│101 │b │
├────────┼──────────────────┤
│102 │b │
├────────┼──────────────────┤
│102 │c │
└────────┴──────────────────┘
下面是匹配部分标识符组合的参考 table
到我需要用于显示目的的单个(唯一)IDCode
。设计是
我认为这不是理想的东西,但那是预先存在的,所以
我得凑合一下。
┌──────┬────────────────────┬────────────────────┬────────────────────┐
│IDCode│Partial_Identifier_1│Partial_Identifier_2│Partial_Identifier_3│
├──────┼────────────────────┼────────────────────┼────────────────────┤
│1 │a │ │ │
├──────┼────────────────────┼────────────────────┼────────────────────┤
│2 │a │b │ │
├──────┼────────────────────┼────────────────────┼────────────────────┤
│3 │a │b │c │
├──────┼────────────────────┼────────────────────┼────────────────────┤
│4 │b │ │ │
├──────┼────────────────────┼────────────────────┼────────────────────┤
│5 │b │c │ │
├──────┼────────────────────┼────────────────────┼────────────────────┤
│6 │b │c │d │
└──────┴────────────────────┴────────────────────┴────────────────────┘
对于第一个 table 中的数据,我想要以下结果:
┌────────┬──────┐
│Identity│IDCode│
├────────┼──────┤
│100 │3 │
├────────┼──────┤
│101 │4 │
├────────┼──────┤
│102 │5 │
└────────┴──────┘
如果您能提供任何关于如何处理这种时髦的帮助,我们将不胜感激。
可能不是最有效的方法,但这会起作用:
declare @a table (id int, p_id nchar(1))
insert @a
select 100,'a'
union select 100,'b'
union select 100,'c'
union select 101,'b'
union select 102,'b'
union select 102,'c'
declare @b table (idcode int, p_id1 nchar(1), p_id2 nchar(1), p_id3 nchar(1))
insert @b
select 1, 'a', null, null
union select 2, 'a', 'b', null
union select 3, 'a', 'b', 'c'
union select 4, 'b', null, null
union select 5, 'b', 'c', null
union select 6, 'b', 'c', 'd'
select id, idcode
from
(
select id
, max(case when r=1 then p_id end) a
, max(case when r=2 then p_id end) b
, max(case when r=3 then p_id end) c
from (
select id, p_id, row_number() over (partition by id order by p_id) r
from @a
) x
group by id
) y
inner join @b b
on coalesce(b.p_id1,'') = coalesce(y.a,'')
and coalesce(b.p_id2,'') = coalesce(y.b,'')
and coalesce(b.p_id3,'') = coalesce(y.c,'')
order by id
这让我有点头疼。我已经简化了 tables 并添加了一个示例场景来帮助理解上下文。我需要在 SQL 服务器中编写一个查询,它将通过中心的引用 table 使用第一个 table 中的数据在第三个 table 中输出结果.我在编写 SQL 查询方面不是很聪明(但肯定会变得更好),所以您能为我提供的任何帮助都会很棒! table如下:
下面是数据table可能包含 单个身份的一个和三个条目。
┌────────┬──────────────────┐
│Identity│Partial_Identifier│
├────────┼──────────────────┤
│100 │a │
├────────┼──────────────────┤
│100 │b │
├────────┼──────────────────┤
│100 │c │
├────────┼──────────────────┤
│101 │b │
├────────┼──────────────────┤
│102 │b │
├────────┼──────────────────┤
│102 │c │
└────────┴──────────────────┘
下面是匹配部分标识符组合的参考 table
到我需要用于显示目的的单个(唯一)IDCode
。设计是
我认为这不是理想的东西,但那是预先存在的,所以
我得凑合一下。
┌──────┬────────────────────┬────────────────────┬────────────────────┐
│IDCode│Partial_Identifier_1│Partial_Identifier_2│Partial_Identifier_3│
├──────┼────────────────────┼────────────────────┼────────────────────┤
│1 │a │ │ │
├──────┼────────────────────┼────────────────────┼────────────────────┤
│2 │a │b │ │
├──────┼────────────────────┼────────────────────┼────────────────────┤
│3 │a │b │c │
├──────┼────────────────────┼────────────────────┼────────────────────┤
│4 │b │ │ │
├──────┼────────────────────┼────────────────────┼────────────────────┤
│5 │b │c │ │
├──────┼────────────────────┼────────────────────┼────────────────────┤
│6 │b │c │d │
└──────┴────────────────────┴────────────────────┴────────────────────┘
对于第一个 table 中的数据,我想要以下结果:
┌────────┬──────┐
│Identity│IDCode│
├────────┼──────┤
│100 │3 │
├────────┼──────┤
│101 │4 │
├────────┼──────┤
│102 │5 │
└────────┴──────┘
如果您能提供任何关于如何处理这种时髦的帮助,我们将不胜感激。
可能不是最有效的方法,但这会起作用:
declare @a table (id int, p_id nchar(1))
insert @a
select 100,'a'
union select 100,'b'
union select 100,'c'
union select 101,'b'
union select 102,'b'
union select 102,'c'
declare @b table (idcode int, p_id1 nchar(1), p_id2 nchar(1), p_id3 nchar(1))
insert @b
select 1, 'a', null, null
union select 2, 'a', 'b', null
union select 3, 'a', 'b', 'c'
union select 4, 'b', null, null
union select 5, 'b', 'c', null
union select 6, 'b', 'c', 'd'
select id, idcode
from
(
select id
, max(case when r=1 then p_id end) a
, max(case when r=2 then p_id end) b
, max(case when r=3 then p_id end) c
from (
select id, p_id, row_number() over (partition by id order by p_id) r
from @a
) x
group by id
) y
inner join @b b
on coalesce(b.p_id1,'') = coalesce(y.a,'')
and coalesce(b.p_id2,'') = coalesce(y.b,'')
and coalesce(b.p_id3,'') = coalesce(y.c,'')
order by id