Внешнее соединение в отношении один-ко-многим (Hibernate / SQL) - PullRequest
1 голос
/ 04 ноября 2011

Я хотел бы выполнить внешнее объединение для отношения один-ко-многим (используя SQL или Hibernate), я пытаюсь использовать неправильный синтаксис или это невозможно по проекту?

Давайте рассмотрим простоепример: пользователь может изменять значения параметров.Для параметров без пользовательского значения используется значение по умолчанию:

Table **PARAMETER** :
PAR_ID
PAR_NAME
PAR_DEFAULT_VALUE

Table **USER_PARAMETER** :
UP_ID
UP_PAR_ID
UP_US_ID
UP_CUSTOM_VALUE

Table **USER** :
US_ID
US_LOGIN

Для данного пользователя я хотел бы перечислить все параметры с их значением по умолчанию и их пользовательским значением, если пользователь дал один (и "null ", если у него нет пользовательских значений для этого пользователя).

Я пробовал следующий запрос, но он ничего не возвращает, если у пользователя нет пользовательских значений:

SELECT PAR_NAME, PAR_DEFAULT_VALUE, UP_CUSTOM_VALUE
FROM PARAMETER
LEFT JOIN USER_PARAMETER on UP_PAR_ID = PAR_ID
WHERE UP_US_ID = 1

Я ожидал, что PAR_NAME и PAR_DEFAULT_VALUE будут заполнены для каждого существующего параметра, а UP_CUSTOM_VALUE заполнены для пользовательских параметров (и «null» для других параметров).

1 Ответ

1 голос
/ 04 ноября 2011

Переместите условие us_id = 1 из предложения where в предложение on:

select  *
from    parameter p
left join
        user_parameter up
on      up.up_par_id = p.par_id
        and up.up_us_id = 1

Это приведет к тому, что условие будет применено как часть left join, которая будет отфильтровывать только строки из правой таблицы. Предложение where не знает о левом или правом.

Посмотрите на данные этого примера, чтобы понять, почему условие where отфильтровывает все строки без пользовательского значения:

par_id   default_value   user_id  custom_value
1        1              1       2             --> works
2        1              null    null          --> filtered out by UP_US_ID = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...