SQL: объединение двух таблиц без декартового произведения - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь объединить две таблицы с одинаковым количеством строк, не создавая полноценного декартова произведения. В некотором смысле это похоже на то, что два столбца одинаковой длины расположены рядом друг с другом, независимо от порядка.

Если говорить более конкретно, скажу, что у меня есть две таблицы. Таблица а:

id  fieldA  commonField
1   foo1    value1
2   foo2    value1
3   foo3    value2
4   foo4    value2

и таблица b:

id  fieldB  commonField
11  bar1    value1
12  bar2    value1
13  bar3    value2
14  bar4    value2

См. Также sqlfiddle . Результат запроса, который я ищу, должен быть:

id  fieldA  commonField fieldB
1   foo1    value1  bar1
2   foo2    value1  bar2
3   foo3    value2  bar3
4   foo4    value2  bar4

Порядок столбца fieldB в пределах того же значения commonField не важен.

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Вы можете попробовать, как указано ниже:

select t1.id, t1.fieldA,t2.fieldB
from
(SELECT a.*, row_number() OVER (order by commonfield) as rn from a) as t1
join (select fieldB, row_number() OVER (order by commonfield) as rn from b) as t2
on t1.rn = t2.rn
0 голосов
/ 19 июня 2019

С SQL Server:

with t1 (rNO, id, fieldA, commonField) as
(
select row_number() over (partition by commonField order by id), id, fieldA, commonField
from a
),
t2 (rNO, id, fieldB, commonField) as
(
select row_number() over (partition by commonField order by id), id, fieldB, commonField
from b
)
select t1.id, t1.fieldA, t1.commonField, t2.fieldB 
from t1
inner join t2 on t1.commonField = t2.commonField and t1.rNo = t2.rNo;

PS: В зависимости от ваших потребностей вы можете искать полное объединение:

with t1 (rNO, id, fieldA, commonField) as
(
select row_number() over (partition by commonField order by id), id, fieldA, commonField
from a
),
t2 (rNO, id, fieldB, commonField) as
(
select row_number() over (partition by commonField order by id), id, fieldB, commonField
from b
)
select coalesce(t1.id, t2.id) as id, t1.fieldA, coalesce(t1.commonField, t2.commonField) as commonField, t2.fieldB 
from t1
full join t2 on t1.commonField = t2.commonField and t1.rNo = t2.rNo;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...