根据列之间的一对多关系复制行
Replicate rows based on one to many relationships between columns
这一定是一个已解决的问题,但我不知道在 google 上搜索的正确术语。所以,这里就把问题说明一下。
我有以下数据集,它有两个不同的用户标识符(比如 id1
和 id2
)。
+------+-----+-------+
| id1 | id2 | value |
+------+-----+-------+
| 1 | 11 | blah1 |
| 1 | 12 | blah2 |
| 2 | 13 | blah3 |
| null | 14 | blah4 |
+------+-----+-------+
id1
和id2
之间是一对多的关系,所以id2
11和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
这一定是一个已解决的问题,但我不知道在 google 上搜索的正确术语。所以,这里就把问题说明一下。
我有以下数据集,它有两个不同的用户标识符(比如 id1
和 id2
)。
+------+-----+-------+
| id1 | id2 | value |
+------+-----+-------+
| 1 | 11 | blah1 |
| 1 | 12 | blah2 |
| 2 | 13 | blah3 |
| null | 14 | blah4 |
+------+-----+-------+
id1
和id2
之间是一对多的关系,所以id2
11和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