0

我是第一次进入 SQL 世界的学生,我找不到任何关于如何使用 to_somedatatype(null) 替换 UNION、INTERSECT 等中缺失列的清晰易懂的文档。我正在使用 HR为我的前几个项目内置了 Oracle 数据库的架构,并且以下查询有效(我得到了一个只有那些有家属的员工的employee_id 编号列表):

SELECT employee_id "Employees with Dependents"
FROM employees
INTERSECT
SELECT relative_id
FROM dependents;

但是,一旦我想包含员工的姓名和受抚养人的出生日期,我就被卡住了。此变体执行无错误搜索但不产生任何结果(输出“未选择行”):

SELECT e.employee_id "Employees with Dependents",
  e.first_name,
  e.last_name,
  to_date(NULL) "Dependent Birthdate"
FROM employees e
INTERSECT
SELECT d.relative_id,
  TO_CHAR(NULL),
  TO_CHAR(NULL),
  d.birthdate
FROM dependents d;

将 to_date 替换为 to_number 或只是纯 null 和 to_char 替换为 to_varchar2 或 null 的几种变体无法生成任何行。

我想要为每个受抚养人制作一行,其中显示监护人的雇员编号、名字、姓氏和受抚养人的出生日期。我相信我的问题是这些空占位符的使用,以及对集合运算符的一般理解有限。(我的理解是,当我使用像 to_date(null) 这样的空占位符时,它不会包含在比较中,因为没有什么可以比较的。)

有人可以向我解释如何正确使用这些占位符吗?

4

2 回答 2

1

当一个或另一个表中不存在列时,您必须匹配数据类型(使用 TO_CHAR 函数或任何其他转换函数)。例如:

SELECT location_id, department_name "部门", TO_CHAR(NULL) "仓库位置" FROM部门 UNION SELECT location_id, TO_CHAR(NULL) "部门", state_province FROM位置;

让你与你的场景联系起来

于 2017-06-09T07:55:56.493 回答
0

您的查询不起作用的原因是相应字段中没有 NULL 值。您正在使用INTERSECT. 实际上,您想将表格连接在一起,例如:

SELECT e.employee_id "Employees with Dependents",
  e.first_name,
  e.last_name,
  d.birthdate "Dependent Birthdate"
FROM employees e join
     dependents d
     on d.relative_id = e.employee_id
于 2013-01-21T23:35:11.917 回答