sqlite 将列“展开”为行

nx7onnlm  于 2023-08-06  发布在  SQLite
关注(0)|答案(2)|浏览(106)

想象一个非常简单的数据库模式:

CREATE TABLE Employee
(
    id INTEGER PRIMARY KEY NOT NULL,
    name TEXT NOT NULL
);

CREATE TABLE Department
(
    id INTEGER PRIMARY KEY NOT NULL,
    name TEXT NOT NULL,
    manager_employee_id INTEGER,
    loveliest_jumper_employee_id INTEGER
);

字符串
这里,Department表中的两个..._employee_id列是Employee表的外键。
我想得到一份员工信息清单,列出所有员工的信息,这些员工要么是经理,要么是他们部门里最可爱的员工。
这样做可以:

SELECT Employee.* 
FROM Employee, Department 
WHERE Employee.id = Department.manager_employee_id
UNION
SELECT Employee.* 
FROM Employee, Department 
WHERE Employee.id = Department.loveliest_jumper_employee_id;


但这有点痛苦。在我的例子中,实际上有四个相关的外键列,而不是两个,所以它更加多余。有没有更简单的方法来写这个查询?
关于我的情况的一些额外要点:

  • 有时候外键可能是NULL(即没有经理和/或在该部门中根本没有可爱的跳线),并且在结果集中不应该有用于该情况的行。
  • 您可以假设没有外键(NULL除外)被列在多个行或列中(没有一个是多个部门的)。而且没有经理有可爱的跳线)。
  • 除了Employee表,我不需要结果集中的任何信息。既不是部门名称,也不是员工与部门的关系(经理/可爱的毛衣穿着者)。
vohkndzv

vohkndzv1#

我们也可以使用IN子句:

SELECT e.* 
FROM Employee e
INNER JOIN Department d 
  ON e.id IN (d.manager_employee_id, d.loveliest_jumper_employee_id);

字符串

zaq34kh6

zaq34kh62#

SELECT e.* 
FROM Employee e
INNER JOIN Department d 
  ON e.id = d.manager_employee_id OR e.id = d.loveliest_jumper_employee_id;

字符串

相关问题