使用T-SQL,如何使用SQL从表中提取唯一集合。这是一个示例表:
ID Value
1 A
1 B
1 C
2 A
2 B
2 C
3 D
3 E
4 D
4 E
5 X
5 Y
5 Z
6 Q
7 Q
8 Q
9 Q
10 A
在这种情况下,所需的结果集将具有以下五个唯一集:
A
B
C
D
E
X
Y
Z
Q
A
这是我必须转换的传入数据的代表。传入的数据有数百个这样的重复集。识别这些集合具有重要价值;把它们放在一张单独的桌子上;为他们分配一个SetID;然后根据SetID JOIN将核心数据关联到相关集合;等
答案 0 :(得分:1)
如果你没有2017,你可以使用xml路径的东西。 例如
drop table t
go
create table t(ID int ,Value varchar(1));
go
insert into t values
(1 , 'A'),
(1 , 'B'),
(1 , 'C'),
(2 , 'A'),
(2 , 'B'),
(2 , 'C'),
(3 , 'D'),
(3 , 'E'),
(4 , 'D'),
(4 , 'E'),
(5 , 'X'),
(5 , 'Y'),
(5 , 'Z'),
(6 , 'Q'),
(7 , 'Q'),
(8 , 'Q'),
(9 , 'Q'),
(10, 'A');
获取一组行
select distinct
maskdetail = STUFF((
SELECT ',' + t1.value
FROM t t1
WHERE t1.id = t.id
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from t
maskdetail
------------------------------
A
A,B,C
D,E
Q
X,Y,Z
(5 row(s) affected)
获取一组
select t.value
from t
join
(
select min(id) minid,maskdetail
from
(
select distinct t.id,
maskdetail = STUFF((
SELECT ',' + t1.value
FROM t t1
WHERE t1.id = t.id
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from t
) s
group by maskdetail
) x
on x.minid = t.id
value
-----
A
A
B
C
D
E
Q
X
Y
Z
(10 row(s) affected)
答案 1 :(得分:0)
如果您的DBMS有一个group_concat / listagg功能,那么它很简单
feof()