(初学者)如何从Oracle内部联接语句结果中排除空值以及如何在任何属性中仅显示空数据

332nm8kg  于 2022-12-22  发布在  Oracle
关注(0)|答案(1)|浏览(103)

(初学者)
问题1)如何从Oracle内部连接语句结果中排除空值,即仅显示包含所有值的行(即任何属性中均无空数据)
问题2)如何仅显示四个表中任何一个表的任何属性中存在缺失/空数据的记录
下面是oracle sql中的虚拟示例
创建4个表格,即姓名、详细信息、社会关系、地址

`create table name
(
id number,
firstname varchar2(20),
lastname varchar2(20)
);

create table details
(
id number,
dob_month varchar2(20),
dob_day varchar2(20),
dob_year varchar2(20)
);

create table social
(
id number,
ssn varchar2(20),
telephone number
);

create table address
(
id number,
address varchar2(20)
);
`

现在将虚拟数据插入到上述表中

`insert into name values (1, 'Will' , 'Smith');
insert into name values (2, 'Barry' , 'White');
insert into name values (3, 'Tom' , 'Jones');
insert into name values (4, 'Rod' , 'Stewart');
insert into name values (5, 'Elvis' , 'Presley');

insert into details values (1,'May',31,null);
insert into details values (2,'August',22,1980);
insert into details values (3,'October',null,1973);
insert into details values (4,'January',30,1980);
insert into details values (5,'March',11,1980);

insert into social values (1,'123-45-6789',null);
insert into social values (2,'222-45-5555',789456123);
insert into social values (3,'333-45-7777',888888888);
insert into social values (4,null,693456741);
insert into social values (5,'999-45-1111',null);

insert into address values (null, null);
insert into address values (2, '12th street');
insert into address values (null, null);
insert into address values (4, '14th Avenue');
insert into address values (5, null);`

Q1 Pictorial Explanation
对于第一季度,
我尝试了以下Oracle SQL查询(两者返回相同的结果),但无法确定将从Oracle内部连接语句结果中排除空值并仅显示具有所有值(即非空值)的行的确切查询

`select name.id, firstname, lastname, dob_month, dob_year, ssn, telephone, address
from name, details, social, address
where name.id=details.id
and details.id=social.id
and social.id=address.id;

select name.id, firstname, lastname, dob_month, dob_year, ssn, telephone, address
from name join details on name.id=details.id
join social on details.id=social.id
join address on social.id=address.id;`

对于第2季度,我正在寻找示例查询,即如何仅显示四个表中任何一个表的任何属性中存在缺失/空数据的记录

myzjeezk

myzjeezk1#

对于第一个问题,我想你是在寻找这个:

select name.id, firstname, lastname, dob_month, dob_year, ssn, telephone, address
from name 
   join details on name.id=details.id
   join social on details.id=social.id
   join address on social.id=address.id
where dob_year is not null
   and dob_day is not null
   and telephone is not null
   and ssn is not null
   and address is not null;

或者短一点

...
where COALESCE(dob_year, dob_day, telephone, ssn, address) is not null;

对于第2季度,它将是

select *
from address
where id is null
   or address is null;

更多注解:
存储日期部分甚至本地化字符串是一个糟糕的设计。你应该永远不要这样做。在你的情况下应该这样做

create table details
(
id number,
dob_date DATE
);

接下来的问题是,为什么要创建四个表?也许你在学校里学过database normalization,但你理解得太字面了。一个人可以有多个SSN/电话吗?如果不能,那么将这些列添加到name表(也可以将其重命名为person),而不是单独的表。同样的问题也适用于表address

相关问题