Как я могу указать на случай фиктивной записи по умолчанию, когда внешний ключ равен нулю - PullRequest
0 голосов
/ 26 июня 2019

У меня есть запрос, в котором я присоединяюсь к многомерной таблице для создания таблицы фактов. Для случаев, когда внешний ключ равен нулю, я хочу указать на фиктивные записи по умолчанию, добавленные в таблицы измерений, чтобы в полях не было нулевого значения. Как это возможно . Пожалуйста, помогите.

Select 
a.name,
a.id_no,
d.dealer_name,
d.address

from 
contract a
left join dealer b 
on a.con_id=b.con_id

Для приведенного выше примера, когда b.con_id равен нулю, и в таких случаях совпадение не найдено, я хочу указать на внешний ключ по умолчанию (0), добавленный в таблицу дилеров. Это похоже на то, что если FK равно нулю, взять значение по умолчанию fk и использовать эти записи для заполнения полей

Ответы [ 4 ]

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

Можно использовать подход, обеспечивающий, чтобы каждая таблица измерений имела строку по умолчанию, скажем, с -1 в качестве значения:

insert into dim_table (dim_table_id, . . . )
    values (-1, . . . );

Тогда в большинстве баз данных вы можете объявить ссылку как:

create table other_table (
    . . .,
    dim_table_id int not null default -1 references dim_table(dim_table_id)
    . . .
);

Однако я не думаю, что Hive (пока) поддерживает значения default для столбцов.Таким образом, вы можете сделать это, но вам нужно явно вставить -1 при вставке новых строк в ссылочные таблицы.

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

Вы можете использовать ISNULL() в своем запросе.

Например:

select * 
from table1 as a 
left join table2 as b on a.id = ISNULL(b.id, 0)
0 голосов
/ 26 июня 2019

Вы можете заменить значениями по умолчанию для несоединенных записей, например так:

Select 
a.name,
a.id_no,
case when d.con_id is null then 'Default Name' else d.dealer_name end dealer_name  ,
case when d.con_id is null then 'Default Address' else d.address  end address
from 
contract a
left join dealer d 
on a.con_id=d.con_id

Или добавить второе соединение с функцией con_id = 0:

Select 
a.name,
a.id_no,
case when d.con_id is null then d0.dealer_name else d.dealer_name end dealer_name  ,
case when d.con_id is null then d0.address     else d.address     end address
from 
contract a
left join dealer d on a.con_id=d.con_id
left join dealer d0 on d.con_id is null and d0.con_id=0
0 голосов
/ 26 июня 2019

Вы можете или оставить это значение пустым или . Вы можете указать запись факта на фиктивную запись, показывающую, что на нее нет ссылки (с идентификатором <0, указывающим на это). </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...