根据列之间的一对多关系复制行

Replicate rows based on one to many relationships between columns

这一定是一个已解决的问题,但我不知道在 google 上搜索的正确术语。所以,这里就把问题说明一下。

我有以下数据集,它有两个不同的用户标识符(比如 id1id2)。

+------+-----+-------+
| id1  | id2 | value |
+------+-----+-------+
| 1    | 11  | blah1 |
| 1    | 12  | blah2 |
| 2    | 13  | blah3 |
| null | 14  | blah4 |
+------+-----+-------+ 

id1id2之间是一对多的关系,所以id211和12的用户实际上是同一个用户。我想为这些用户复制行,以便 value 与每个 id2 相关联。生成的数据集看起来像

+------+-----+-------+
| id1  | id2 | value |
+------+-----+-------+
| 1    | 11  | blah1 |
| 1    | 12  | blah2 |
| 2    | 13  | blah3 |
| null | 14  | blah4 |
| 1    | 12  | blah1 |
| 1    | 11  | blah2 |
+------+-----+-------+ 

如您所见,值 blah1 现在与 11 和 12 id2 相关联,值 blah2.

也是如此

一定有某种 self-join 可以做到这一点,但我不知道它叫什么(SQL 新手)。如果有人能指出正确的方向,我将不胜感激。

为此,您可以使用 join 生成行:

select i.id1, i.id2, iv.value
from (select distinct id1, value from t) iv join
     (select distinct id1, id2 from t) i 
     on iv.id1 = i.id1 ;

实际上,第二个 select distinct 可能不是必需的(除非您的原始数据有重复项,如果您将这些行添加回 table),但我认为它可以进行查询更清晰。这也应该有效:

select t.id1, t.id2, iv.value
from (select distinct id1, value from t) iv join
     t 
     on iv.id1 = t.id1 ;

好吧,你可以自己加入,这是完全允许的... Join will link columns based on a key connection (在一般情况下) 请注意,在这种情况下还需要联合,因为你想要更多的行,而不是列

SELECT t.*
FROM
table t
INNER JOIN table t2 ON t.id1 = t2.id1 AND t. id2 != t2.id2

UNION

SELECT t.*
FROM
table t
INNER JOIN table t2 ON t.id1 = t2.id1 AND t. id2 = t2.id2