Репликация строк на основе одного-многих отношений между столбцами - PullRequest
0 голосов
/ 25 сентября 2018

Это должно быть решенной проблемой, но я не знаю подходящих терминов для поиска в 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.

*.1020 * Должен быть какой-то self-join, который делает это, но я не знаю, как это называется (SQL-новичок).Буду признателен, если кто-нибудь укажет мне правильное направление.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Ну, вы можете самостоятельно присоединиться, это полностью разрешено ... Присоединение будет связывать столбцы на основе ключевого соединения (в общем случае). Обратите внимание, что в этом случае также потребуется объединение, потому что вам нужно больше строк, а нестолбцы

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
0 голосов
/ 25 сентября 2018

Вы можете сгенерировать строки, используя 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, вероятно, не нужна (если только в ваших исходных данных не было дубликатов, как если бы вы добавили этистроки обратно в таблицу), но я думаю, что это делает запрос более понятным.Это также должно работать:

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