Соединение двух таблиц с иногда отсутствующими значениями соединения - PullRequest
1 голос
/ 05 апреля 2019

У меня есть две таблицы для объединения с двумя столбцами, например person_id, component. Для одного человека может быть несколько компонентов, но компоненты могут быть одинаковыми для другого человека.

Проблема в том, что в одной из таблиц есть все правильные данные, а во второй - некоторые пропущенные значения во втором столбце.

Две таблицы выглядят примерно так:

Первый стол:

+----------+-----------+
| person_id|  component| 
+----------+-----------+
| sth      |   A       |  <-- 
| sth      |   B       |  <-- two components for sth
| sth1     |   A       |  <-- A component for sth1
| sth2     |   A       | 
| sth3     |   B       |  <-- B component for sth3 
+----------+-----------+

Обратите внимание, что есть только один компонент для sth1 и 3

Второй стол:

+----------+-----------+-------+
| person_id|  component| value |
+----------+-----------+-------+
| sth      |   A       | 1     |
| sth      |   B       | 21    |
| sth1     |   null    | 313   |<--should be matched with A component from sth1
| sth2     |   A       | 2     |
| sth3     |   null    | 12    |<--should be matched with B component from sth3
+----------+-----------+-------+

Обратите внимание, что эти нулевые значения могут быть сопоставлены только с одной строкой таблицы A.

Так что мне нужны значения из второй таблицы, но мне также нужна первая, чтобы сопоставить нулевые компоненты с реальными компонентами. Как видите, отсутствующий компонент не всегда одинаков.

Если во второй таблице отсутствует компонент для person_id sth1, то в первой таблице будет только ОДИН компонент для этого идентификатора. поэтому не нужно выбирать как-то просто, просто сказать, что в таблице B отсутствует значение в компоненте, тогда это должно быть сопоставлено с идентификатором персоны таблицы A.

И, конечно, я не могу просто сопоставить идентификаторы лиц, потому что он не будет знать, какое значение соответствует какому компоненту.

Ответы [ 3 ]

0 голосов
/ 05 апреля 2019

Сначала вы можете попробовать объединить идентификатор человека и компонент, а затем объединить вывод объединения по идентификатору человека, когда компонент имеет значение Null

Select a.person_id,a.component,b.value 
FROM table1 a
INNER JOIN table2 b
on a.person_id=b.person_id and a.component=b.component

UNION ALL

Select a.person_id,a.component,b.value 
FROM table1 a
INNER JOIN table2 b
on a.person_id=b.person_id 
WHERE component is NULL
0 голосов
/ 05 апреля 2019

Если я правильно понимаю, это проблема, когда вы используете null по умолчанию. Если это так, я обычно обрабатываю это с помощью left join s:

select t1.person_id, t1.component,
       coalesce(t2.value, t2default.value) as value
from first_table t1 left join
     second_Table t2
     on t1.person_id = t2.person_id and t1.component = t2.component left join
     secondtable t2default
     on t1.person_id = t2.person_id and
        t2.component is null;

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

0 голосов
/ 05 апреля 2019

Вы можете попробовать ниже -

select a.person_id,a.component,value
from first_table  a
inner join second_Table b on a.person_id=b.person_id and a.component=b.component
union 
select a.person_id,a.component,value
from first_table  a
inner join second_Table b on a.person_id=b.person_id
where b.component is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...