oracle - 加入两个表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;
解决方案
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(+);
我不知道您的数据,因此您需要将其应用于正确的表格。
推荐阅读
- python - 如何在 Django 中发布 Powershell 输出?
- r - 检查用户是否在闪亮的pickerInput菜单中选择了所有
- r - shape_extraction 命令(来自包 dtwclust)如何工作?
- php - 404 在 laravel 中没有显示错误,我该如何调试/修复此更新路线?
- cucumber - 如何跳过具有来自 TestNG 运行器的唯一标签的特定场景
- c++ - C++ 指针可以指向字符串文字的静态成员数组吗?
- css - 显示访问者的按钮颜色更改在当前页面上
- android - 通知中的意图不会改变
- javascript - 流类型,转换为数组类型不适用于显式类型,但适用于隐式类型
- tcp - TCP客户端向外部服务器发送消息,不需要回复消息