SQL服务器:如何SELECT两列的多对多值
SQL Server: How to SELECT the Many-to-Many Values of two Columns
有没有办法 SELECT 仅基于 table 中的 2 列的多对多记录。我不想 select 数据集中的 N:1、1:1 和 N:1 值,而只想 N:N 的值。这意味着我只想 SELECT Column1 中的值在 Column2 中有多个相关值的记录,但 Column2 中的某些(或全部)值在 Column1 中也有多个相关值。
在我下面有一个 table,其中我已经在列 Relationship
中显示了我要查找的内容。所以我只希望能够 SELECT 记录 8。当然不使用列 Relationship
,因为我手动添加了它以理解我想说的内容。
DROP TABLE IF EXISTS TestManytoMany;
CREATE TABLE TestManytoMany
(Column1 nvarchar NULL,
Column2 nvarchar NULL,
Relationship nvarchar(4) NULL);
INSERT INTO TestManytoMany
VALUES
('A','1','n:1')
,('A','2','n:1')
,('A','3','n:1')
,('B','4','1:n')
,('C','4','1:n')
,('D','5','1:1')
,('E','6','n:1')
,('E','7','n:n')
,('F','7','1:n')
SELECT * FROM TestManytoMany
我在互联网上找不到类似的东西,也许有人有什么建议?
亲切的问候,
伊戈尔
将提供您需要的输出的一个选项(虽然我不确定它在更大的数据集上的表现如何)是使用 count
s 而不是 partition
windows:
查询
declare @TestManytoMany table(Column1 nvarchar(5)
,Column2 nvarchar(5)
,Relationship nvarchar(4)
);
insert into @TestManytoMany
values
('A','1','n:1')
,('A','2','n:1')
,('A','3','n:1')
,('B','4','1:n')
,('C','4','1:n')
,('D','5','1:1')
,('E','6','n:1')
,('E','7','n:n')
,('F','7','1:n')
;
with c as
(
select *
,count(1) over (partition by Column1) as c1c
,count(1) over (partition by Column2) as c2c
from @TestManytoMany as t
)
select Column1
,Column2
from c
where c1c > 1
and c2c > 1;
输出
Column1
Column2
E
7
有没有办法 SELECT 仅基于 table 中的 2 列的多对多记录。我不想 select 数据集中的 N:1、1:1 和 N:1 值,而只想 N:N 的值。这意味着我只想 SELECT Column1 中的值在 Column2 中有多个相关值的记录,但 Column2 中的某些(或全部)值在 Column1 中也有多个相关值。
在我下面有一个 table,其中我已经在列 Relationship
中显示了我要查找的内容。所以我只希望能够 SELECT 记录 8。当然不使用列 Relationship
,因为我手动添加了它以理解我想说的内容。
DROP TABLE IF EXISTS TestManytoMany;
CREATE TABLE TestManytoMany
(Column1 nvarchar NULL,
Column2 nvarchar NULL,
Relationship nvarchar(4) NULL);
INSERT INTO TestManytoMany
VALUES
('A','1','n:1')
,('A','2','n:1')
,('A','3','n:1')
,('B','4','1:n')
,('C','4','1:n')
,('D','5','1:1')
,('E','6','n:1')
,('E','7','n:n')
,('F','7','1:n')
SELECT * FROM TestManytoMany
我在互联网上找不到类似的东西,也许有人有什么建议?
亲切的问候, 伊戈尔
将提供您需要的输出的一个选项(虽然我不确定它在更大的数据集上的表现如何)是使用 count
s 而不是 partition
windows:
查询
declare @TestManytoMany table(Column1 nvarchar(5)
,Column2 nvarchar(5)
,Relationship nvarchar(4)
);
insert into @TestManytoMany
values
('A','1','n:1')
,('A','2','n:1')
,('A','3','n:1')
,('B','4','1:n')
,('C','4','1:n')
,('D','5','1:1')
,('E','6','n:1')
,('E','7','n:n')
,('F','7','1:n')
;
with c as
(
select *
,count(1) over (partition by Column1) as c1c
,count(1) over (partition by Column2) as c2c
from @TestManytoMany as t
)
select Column1
,Column2
from c
where c1c > 1
and c2c > 1;
输出
Column1 | Column2 |
---|---|
E | 7 |