假设我们使用左连接或内连接通过某种条件连接两个表(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) 现在困难的部分是:每个表中的 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|
答案 0 :(得分:1)
加入表格后很困难,我没有找到快速的解决方案。我想,这是一个组合问题,因为结果取决于您处理数据的顺序。但是如果数据变了,结果就完全不一样了……也许有人证明我错了……
但是,如果我们能够在加入之前修改表,那就更好了:
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
现在我们可以添加行数。所以我们可以合并数据和行数。这确保每个数据只合并一次。