SELECT 只能出现一次的 DISTINCT 行

SELECT DISTINCT rows that can occur only once

假设我们使用左连接或内连接

按某种条件连接两个 table(A 和 B)
WITH
a(id, x) AS (VALUES
    (0, 'a'),
    (1, 'a'),
    (2, 'b')
),
b(id, y) AS (VALUES
    (10, 'a'),
    (20, 'a'),
    (30, 'b')
),
pairs AS (
    SELECT a.id AS a_id, b.id AS b_id
    FROM a LEFT JOIN b ON a.x=b.y
)
SELECT * FROM pairs; -- how to modify this query to return the expected result?

结果将是 5 行 (2 * 2 + 1 * 1) 现在困难的部分是:每个 table 的 id 只能在结果中出现一次。

a_id|b_id|
----|----|
   0|  10|
 ->0|  20| -- a_id=0 can be picked only once
   1|->10| -- b_id=10 can be picked only once
   1|  20|
   2|  30|

-- so the expected result is:
a_id|b_id|
----|----|
   0|  10|
   1|  20|
   2|  30|

-- UPDATE: alternative result could be:
a_id|b_id|
----|----|
   0|  20|
   1|  10|
   2|  30|

demo:db<>fiddle

加入表格后很困难,我没有找到快速的解决方案。我想,这是一个组合问题,因为结果取决于您处理数据的顺序。但是如果数据改变了,结果就完全不一样了……也许有人证明我错了……

但是,如果我们能够在加入之前修改表,那就更好了:

WITH
a(id, x) AS (VALUES
    (0, 'a'),
    (1, 'a'),
    (2, 'b')
),
b(id, y) AS (VALUES
    (10, 'a'),
    (20, 'a'),
    (30, 'b')
),
pairs AS (
    SELECT a.id AS a_id, b.id AS b_id
    FROM (
        SELECT
            *,
            row_number() OVER (PARTITION BY x)
        FROM
            a
    ) a
    LEFT JOIN (
        SELECT
            *,
            row_number() OVER (PARTITION BY y)
        FROM
            b
    ) b ON a.x=b.y AND a.row_number = b.row_number
)
SELECT 
    *
FROM pairs

现在我们可以添加行数了。所以我们可以合并数据和行数。这确保每个数据只合并一次。