如何解决SELECT DISTINCT 行只能出现一次
假设我们使用左连接或内连接通过某种条件连接两个表(A 和 B)
WITH
a(id,x) AS (VALUES
(0,'a'),(1,(2,'b')
),b(id,y) AS (VALUES
(10,(20,(30,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|
解决方法
加入表格后很困难,我没有找到快速的解决方案。我想,这是一个组合问题,因为结果取决于您处理数据的顺序。但是如果数据变了,结果就完全不一样了……也许有人证明我错了……
但是,如果我们能够在加入之前修改表,那就更好了:
WITH
a(id,x) AS (VALUES
(0,'a'),(1,(2,'b')
),b(id,y) AS (VALUES
(10,(20,(30,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
现在我们可以添加行数。所以我们可以合并数据和行数。这确保每个数据只合并一次。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。