首页 > 解决方案 > 加入两个表sqlplus,共享列名,返回NULL

问题描述

我有三个表,我想加入看起来像

student_id、first_name、last_name、club_id、club_name。

有成员在一个俱乐部中活跃,但在另一个俱乐部中不活跃,因此该成员将同时出现在活跃和不活跃的表中。还有一个成员在任何俱乐部都不活跃,但我需要返回他们的 id、first_name 和 last_name。我的代码目前不返回 club_id 中为 NULL 的会员信息。

active_member(student_id(PK), first_name, last_name, club_id(FK))

inactive_member(student_id(PK), first_name, last_name, club_id(FK))

member_club(club_id(PF), club_name,) 

SELECT a.student_id, a.first_name, a.last_name, c.club_id, c.club_name
FROM active_member a, member_club c
WHERE c.club_id = a.club_id
UNION ALL
SELECT b.student_id, b.first_name, b.last_name, c.club_id, c.club_name
FROM member_club c, inactive_member b
WHERE c.club_id = b.club_id;

标签: oraclesqlplus

解决方案


NULL 不能作为值进行比较,因为 null 表示该值不存在可比较。

您可以用括号括起来并使用 OR IS NULL 检查...

或者,我更喜欢使用 NVL() 并在它不存在时将其转换为一个值,例如NVL(c.club_id, -1) = NVL(b.club_id, -1)

这是一个显示 NVL() 选项的 Fiddle 示例: http ://sqlfiddle.com/#!4/f41750/9/0

- - 更新: - -

以上假设连接表中有一行。如果该行不存在,那么您需要外连接表。例如,在可能没有行的表之后使用 (+),例如

SELECT a.student_id, a.first_name, a.last_name, c.club_id, c.club_name
FROM active_member a, member_club c
WHERE c.club_id = a.club_id(+)
UNION ALL
SELECT b.student_id, b.first_name, b.last_name, c.club_id, c.club_name
FROM member_club c, inactive_member b
WHERE c.club_id = b.club_id(+);

我不知道您的数据,因此您需要将其应用于正确的表格。


推荐阅读