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

(Beginner) How to exclude null value from Oracle Inner Join Statement Result and How to show ONLY null data in any of the attributes

提问人:Advait Advait 提问时间:12/20/2022 最后编辑:Advait Advait 更新时间:12/20/2022 访问量:121

问:

(初级)

Q1) 如何从 Oracle 内部连接语句结果中排除 null 值。即仅显示具有所有值的那一行(即任何属性中都没有空数据)

Q2) 如何仅显示那些在四个表中的任何一个属性中缺少/空数据的记录

下面是 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 图片说明

对于第一季度,

我尝试了下面的oracle sql查询(两者都返回相同的结果),但无法找出确切的查询,该查询将从Oracle内部连接语句结果中排除null值,并仅显示具有所有值的那行(即不为空)

`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 季度,我正在寻找示例查询 即如何仅显示那些在四个表中的任何一个属性中缺少/空数据的记录

oracle join null 内部联接

评论

0赞 philipxy 12/20/2022
请问 1 个问题。(显然,)这两个都是常见问题解答。在考虑发布之前,请:通过最小的可重现示例确定代码问题。閱讀手冊/參考和谷歌任何錯誤信息,以及你的問題/問題/目標的許多清晰,簡斷和精確的措辭,有&沒有你的特定名稱/字符串/數字,“site:stackoverflow.com”和標籤;阅读许多答案。在帖子中反映研究。SO/SE搜索很差,字面意思很不寻常,请阅读帮助。谷歌重新搜索/搜索,包括Meta Stack Overflow和Meta Stack Exchange的问答。研究工作 How to Ask 帮助中心

答:

1赞 Wernfried Domscheit 12/20/2022 #1

对于第一个问题,我认为您正在寻找这个:

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;

对于第二季度,它将是这样的

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

更多说明:

存储日期部分,然后存储本地化字符串是一个糟糕的设计。你永远不应该那样做。就你而言,它应该是

create table details
(
id number,
dob_date DATE
);

那么下一个问题,为什么要创建四个表?也许你在学校学到了数据库规范化,但你太从字面上理解了。一个人可以拥有多个 SSN/电话吗?如果没有,则将这些列添加到表中(并可能将其重命名为 ),而不是单独的表。同样的问题也适用于表。namepersonaddress

评论

0赞 Advait Advait 12/20/2022
对于 Q2) 我基本上是在寻找我从你的 Q1 的答案中得到的这个,选择 name.id、名字、姓氏、dob_month、dob_year、ssn、电话、地址,地址从姓名 name.id=details.id 上的完整外部加入详细信息 details.id=social.id 上的完整外部加入社交 social.id=address.id 上的完整外部加入地址,其中 firstname 为 null 或 lastname 为 null 或 dob_month为 null 或 dob_year为 null 或电话为 null 或 ssn 为null 或 address 为 null;
0赞 Advait Advait 12/20/2022
使用COALESCE它会抛出错误,知道如何解决吗?ORA-00932:不一致的数据类型:预期的 CHAR 编号为 00932。00000 - “不一致的数据类型:预期的 %s 得到了 %s” *原因: *操作:查询 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 其中 COALESCE(dob_year, dob_day, telephone, ssn, address) 不为 null;
0赞 Wernfried Domscheit 12/20/2022
哦,是的,要求所有参数都是相同的类型。根据您的具体情况跳过它。我认为对于初学者来说,第一个解决方案无论如何都更容易理解。COALESCE