外键为null时如何指向默认的伪记录

brjng4g3  于 2021-06-24  发布在  Hive
关注(0)|答案(4)|浏览(401)

我有一个查询,在这个查询中我联接多维表来创建事实表。对于外键为null的情况,我希望将其指向维度表中添加的默认伪记录,以便字段中没有null值。怎么可能。请帮忙。

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\u id为空并且在这种情况下没有找到匹配项时,我想指向添加在dealer表中的默认外键(0)。它就像如果fk为null,则使用默认fk并使用这些记录填充字段

ltqd579y

ltqd579y1#

您可以采取确保每个维度表都有一个默认行的方法,比如 -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 在引用表中插入新行时。

rbl8hiat

rbl8hiat2#

你可以用 ISNULL() 在您的查询中。
例如:

select * 
from table1 as a 
left join table2 as b on a.id = ISNULL(b.id, 0)
3mpgtkmj

3mpgtkmj3#

可以用默认值替换未联接的记录,如下所示:

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\u 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
ifsvaxew

ifsvaxew4#

您可以将它保持为null,也可以将事实记录指向一个显示没有引用的伪记录(id<0表示它)。

相关问题