НАРУЖНОЕ СОЕДИНЕНИЕ с NULL - PullRequest
0 голосов
/ 30 апреля 2020

Я использую Postgresql и имею две таблицы, подобные следующей:

Nodes             Node_Properties
-----             ---------------
id                id
attr1             name
attr2             value

Данные в таблице свойств узла выглядят следующим образом:

id       name     value
----     ----     -----
1465     car      2
1465     boat     1

Если нет велосипеда свойство, связанное с идентификатором, я хочу вернуть пустым.

select p.value, n*  from nodes n
  RIGHT OUTER JOIN node_properties p on n.id=p.id
  where p.name = 'bike';

ничего не возвращает.

select p.value, n*  from nodes n
  RIGHT OUTER JOIN node_properties p on n.id=p.id;

возвращает

2   1465  attr1   attr2
1   1465  attr1   attr2

Я ожидаю результата:

-   1465  attr1   attr2
where '-' == empty

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Я думаю, вы неправильно понимаете, что на самом деле делает внешнее соединение / где комбинация. Внешнее соединение (левое или правое) возвращает данные на одной стороне, даже если данные не существуют на другой. Ничто из того, что вы делаете с данными, которых не существует ни с одной стороны, не появляется в наборе результатов. Если вам нужно что-то, чего на самом деле не существует, вам нужно представить его. Я не могу думать о какой-либо цели, стоящей за этим, вы можете получить то, что вы хотите, следующим образом:

with np (id, name, value) as
     (select id, name, value
        from node_properties
      union 
      -- bike must appear in the output so generate a row if it doesn't exist.
      select null, 'bike', null 
      where not exists 
            (select null
               from node_properties
              where name = 'bike'
            )  
     )
select n.id      node_id 
     , n.name    node_name
     , np.name   properties_name
     , np.value  properties_value
  from np 
  left join nodes n on np.id = n.id
 order by n.id nulls first;
1 голос
/ 30 апреля 2020

Я думаю, что вы хотите left join:

select n.*, p.value 
from nodes n left join
     node_properties np
     on n.id = np.id and p.name = 'bike';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...