Объединение подмножества с его родительским набором

У меня есть две таблицы, A и B. B является случайным подмножеством A, но с некоторыми значениями, которые переопределяют значения по умолчанию в A. Как мне соединить две таблицы, чтобы объединить их значения?

A

1, 0
2, 0
3, 0
4, 0

B

2, 10
3, 11

Выход

1, 0
2, 10
3, 11
4, 0

Вот мой фактический запрос - я думал, что смогу сделать это с помощью LEFT OUTER JOIN, но это ограничивает выходной набор пересечением строк A и B. Мне нужно, чтобы все строки A возвращались, объединенные с соответствующими строками B.

SELECT A.factor, A.categorical_value, coalesce(A.positive, B.positive),  coalesce(A.negative, B.negative) 
FROM features A 
LEFT OUTER JOIN profiles B ON (A.factor=B.factor AND A.categorical_value=B.categorical_value)
WHERE B.uuid='9e5083da74305628336631da9d2903e3' 

Как отмечает ниже Крейг Рингер, я непреднамеренно ограничиваю A пунктом B. Но тогда как мне это сделать? Таблица A — это таблица атрибутов профиля «многие ко многим», где uuid указывает идентификатор пользователя. Таблица B представляет собой основной список всех возможных атрибутов профиля. Я хочу, чтобы запрос возвращал основной список с наложенным на него индивидуальным профилем.


person metalaureate    schedule 27.03.2014    source источник
comment
Вы хотите a LEFT OUTER JOIN b, затем coalesce.   -  person Craig Ringer    schedule 27.03.2014
comment
Благодарю вас! Вопрос обновлен в ответ...   -  person metalaureate    schedule 27.03.2014
comment
В какой таблице находится столбец uuid?   -  person a_horse_with_no_name    schedule 27.03.2014
comment
uuid находится в B. И извиняюсь - мой пример A, B поменялся местами. Я только что исправил это (тот же результат - только возвращает B).   -  person metalaureate    schedule 27.03.2014
comment
но это ограничивает выходной набор пересечением строк A и B. Нет, это не так. Я думаю, вам может понадобиться показать определения таблиц, которые сопровождают реальный запрос, и некоторые реальные данные, потому что левое внешнее соединение, безусловно, не ограничивает строки левой стороны. Это почти определение. Ваша проблема, по-видимому, заключается в том, что у вас есть предложение where для B.uuid, которое никогда не может быть истинным, если для B нет ненулевого значения; таким образом, вы фактически превратили свой left outer join в inner join.   -  person Craig Ringer    schedule 27.03.2014
comment
Шейза, вы правы. Дух. Спасибо, сэр.   -  person metalaureate    schedule 27.03.2014


Ответы (1)


После обновления вопроса:

Как @Craig уже сообщал вам , условие WHERE для B выберет только совпадающие строки в B и будет действовать как [INNER] JOIN вместо LEFT [OUTER] JOIN.

Вам нужно преобразовать это условие WHERE в условие LEFT JOIN.
Пока я занимался этим, я упростил ситуацию с помощью USING, так как имена всех соединяемых столбцов идентичны. Подробности в руководстве.

Информация по-прежнему неполная и противоречивая. Вот еще одно обоснованное предположение:

SELECT a.factor, a.categorical_value
     , COALESCE(a.positive, b.positive) AS positive
     , COALESCE(a.negative, b.negative) AS negative 
FROM   features a 
LEFT  JOIN profiles b USING (factor, categorical_value, uuid)
WHERE  a.uuid='9e5083da74305628336631da9d2903e3'

Не уверен, нужно ли вам присоединиться и на udid.
В вашем примере будет указано COALESCE(b.positive, a.positive). Что-то не сходится...

Больше обновлений в комментариях

Затем адаптируйте условие JOIN:

SELECT a.factor, a.categorical_value
     , COALESCE(a.positive, b.positive) AS positive
     , COALESCE(a.negative, b.negative) AS negative 
FROM   features a 
LEFT   JOIN profiles b ON a.factor = b.factor
                      AND a.categorical_value = b.categorical_value
                      AND b.uuid='9e5083da74305628336631da9d2903e3';
person Erwin Brandstetter    schedule 27.03.2014
comment
Извиняюсь, я не полностью изложил свой вопрос. Я обновил его, чтобы отразить, почему это предложение, которое было моей первой попыткой решения, не сработало. Спасибо за очистку моего вопроса! - person metalaureate; 27.03.2014
comment
@metalaureate: вопрос еще не завершен. Я добавил еще одну версию. - person Erwin Brandstetter; 27.03.2014
comment
Я не достоин помощи, но спасибо. Оставшаяся проблема заключается в том, что моя левая объединенная таблица не содержит uuid. Это шаблон для профилей, но профили содержат несколько разных подмножеств, разделенных uuid. - person metalaureate; 27.03.2014
comment
Я перепутал, извините. A не содержит uuid. Только B. Я хочу выбрать соответствующий профиль в B и объединить его с A. - person metalaureate; 27.03.2014