Postgres select 不同于笛卡尔积
Postgres select distinct of cartesian product
如何从两列中 select 使每个值只出现一次?
例如。来自这个table:
Column A Column B
-------------------------------------------------------------------------
02131d36-06cc-408e-9e40-1de65fbf37f4 7495fc05-e244-426c-bdae-a5ee121be510
11c32339-1b77-46e1-9215-0b1d4ec0b1d3 7495fc05-e244-426c-bdae-a5ee121be510
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 7495fc05-e244-426c-bdae-a5ee121be510
94e66d74-f0ce-472b-ad68-a98e267038b8 7495fc05-e244-426c-bdae-a5ee121be510
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 7495fc05-e244-426c-bdae-a5ee121be510
94e66d74-f0ce-472b-ad68-a98e267038b8 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1
02131d36-06cc-408e-9e40-1de65fbf37f4 c597af82-58d5-4630-87e5-939898cc68ed
11c32339-1b77-46e1-9215-0b1d4ec0b1d3 c597af82-58d5-4630-87e5-939898cc68ed
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 c597af82-58d5-4630-87e5-939898cc68ed
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 c597af82-58d5-4630-87e5-939898cc68ed
94e66d74-f0ce-472b-ad68-a98e267038b8 c597af82-58d5-4630-87e5-939898cc68ed
拉出这个(A 和 B 都不同):
02131d36-06cc-408e-9e40-1de65fbf37f4 7495fc05-e244-426c-bdae-a5ee121be510
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1
94e66d74-f0ce-472b-ad68-a98e267038b8 c597af82-58d5-4630-87e5-939898cc68ed
我知道有几种可能的组合,我想要任何其中之一,但不是全部。
table 由 B 的不同值和 A 的不同值的笛卡尔积的子集构成。
我一直在使用 window 函数和分组依据,但还没有开始工作。
使用 window 函数:
t=# create table so182(a text,b text);
CREATE TABLE
Time: 23.926 ms
t=# copy so182 from stdin delimiter ' ';
t=# select distinct first_value(a) over (partition by b),b from so182;
first_value | b
--------------------------------------+--------------------------------------
02131d36-06cc-408e-9e40-1de65fbf37f4 | 7495fc05-e244-426c-bdae-a5ee121be510
11c32339-1b77-46e1-9215-0b1d4ec0b1d3 | c597af82-58d5-4630-87e5-939898cc68ed
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 | 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1
(3 rows)
区别于:
t=# select distinct on (b) b,a from so182;
b | a
--------------------------------------+--------------------------------------
7495fc05-e244-426c-bdae-a5ee121be510 | 02131d36-06cc-408e-9e40-1de65fbf37f4
7b9fb1b0-61d4-4424-af83-33b1b7e77bc1 | 39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2
c597af82-58d5-4630-87e5-939898cc68ed | 11c32339-1b77-46e1-9215-0b1d4ec0b1d3
(3 rows)
Time: 0.263 ms
抱歉,我现在无法检查它是否有效,但是怎么样:
正在创建 2 个临时的 tables,例如:
CREATE TABLE #ColumnA(id int NOT NULL AUTO_INCREMENT, columna varchar(30))
CREATE TABLE #ColumnB(id int NOT NULL AUTO_INCREMENT, columnb varchar(30))
填写如下:
INSERT INTO ColumnA SELECT DISTINCT columna FROM OriginalTable
INSERT INTO ColumnB SELECT DISTINCT columnb FROM OriginalTable
加入:
SELECT a.columna, b.columnb FROM ColumnA a OUTER JOIN ColumnB b ON a.id = b.id
它不漂亮,但应该可以。在第 1 点中,我用 # 写了 table 名称 - 它似乎正在创建临时 tables。 AUTO_INCREMENT 在不同的 dbms 中也可能不同(在 postgres 中 "id serial" 就足够了)。
如果没有更好的答案,我稍后再查看。
如何从两列中 select 使每个值只出现一次?
例如。来自这个table:
Column A Column B
-------------------------------------------------------------------------
02131d36-06cc-408e-9e40-1de65fbf37f4 7495fc05-e244-426c-bdae-a5ee121be510
11c32339-1b77-46e1-9215-0b1d4ec0b1d3 7495fc05-e244-426c-bdae-a5ee121be510
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 7495fc05-e244-426c-bdae-a5ee121be510
94e66d74-f0ce-472b-ad68-a98e267038b8 7495fc05-e244-426c-bdae-a5ee121be510
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 7495fc05-e244-426c-bdae-a5ee121be510
94e66d74-f0ce-472b-ad68-a98e267038b8 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1
02131d36-06cc-408e-9e40-1de65fbf37f4 c597af82-58d5-4630-87e5-939898cc68ed
11c32339-1b77-46e1-9215-0b1d4ec0b1d3 c597af82-58d5-4630-87e5-939898cc68ed
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 c597af82-58d5-4630-87e5-939898cc68ed
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 c597af82-58d5-4630-87e5-939898cc68ed
94e66d74-f0ce-472b-ad68-a98e267038b8 c597af82-58d5-4630-87e5-939898cc68ed
拉出这个(A 和 B 都不同):
02131d36-06cc-408e-9e40-1de65fbf37f4 7495fc05-e244-426c-bdae-a5ee121be510
ab8130c7-e6a3-46cc-9ebc-0f8aca698169 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1
94e66d74-f0ce-472b-ad68-a98e267038b8 c597af82-58d5-4630-87e5-939898cc68ed
我知道有几种可能的组合,我想要任何其中之一,但不是全部。
table 由 B 的不同值和 A 的不同值的笛卡尔积的子集构成。
我一直在使用 window 函数和分组依据,但还没有开始工作。
使用 window 函数:
t=# create table so182(a text,b text);
CREATE TABLE
Time: 23.926 ms
t=# copy so182 from stdin delimiter ' ';
t=# select distinct first_value(a) over (partition by b),b from so182;
first_value | b
--------------------------------------+--------------------------------------
02131d36-06cc-408e-9e40-1de65fbf37f4 | 7495fc05-e244-426c-bdae-a5ee121be510
11c32339-1b77-46e1-9215-0b1d4ec0b1d3 | c597af82-58d5-4630-87e5-939898cc68ed
39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2 | 7b9fb1b0-61d4-4424-af83-33b1b7e77bc1
(3 rows)
区别于:
t=# select distinct on (b) b,a from so182;
b | a
--------------------------------------+--------------------------------------
7495fc05-e244-426c-bdae-a5ee121be510 | 02131d36-06cc-408e-9e40-1de65fbf37f4
7b9fb1b0-61d4-4424-af83-33b1b7e77bc1 | 39cb3ebd-bb7f-4023-ab44-65a0f3e4d6d2
c597af82-58d5-4630-87e5-939898cc68ed | 11c32339-1b77-46e1-9215-0b1d4ec0b1d3
(3 rows)
Time: 0.263 ms
抱歉,我现在无法检查它是否有效,但是怎么样:
正在创建 2 个临时的 tables,例如:
CREATE TABLE #ColumnA(id int NOT NULL AUTO_INCREMENT, columna varchar(30)) CREATE TABLE #ColumnB(id int NOT NULL AUTO_INCREMENT, columnb varchar(30))
填写如下:
INSERT INTO ColumnA SELECT DISTINCT columna FROM OriginalTable INSERT INTO ColumnB SELECT DISTINCT columnb FROM OriginalTable
加入:
SELECT a.columna, b.columnb FROM ColumnA a OUTER JOIN ColumnB b ON a.id = b.id
它不漂亮,但应该可以。在第 1 点中,我用 # 写了 table 名称 - 它似乎正在创建临时 tables。 AUTO_INCREMENT 在不同的 dbms 中也可能不同(在 postgres 中 "id serial" 就足够了)。 如果没有更好的答案,我稍后再查看。