更重要的是,这是标准化数据库的好时机。您有重复的列,这总是使查询变得困难。假设你有一张employee
桌子:
CREATE TABLE [employee] (
id INT IDENTITY PRIMARY KEY,
first_name VARCHAR(20),
middle_initial CHAR(1),
surname VARCHAR(20)
)
假设现在你的[table]
,我将重命名[project]
的,看起来像:
CREATE TABLE [project] (
id INT IDENTITY PRIMARY KEY,
name VARCHAR(20) NOT NULL,
supervisor_id INT FOREIGN KEY REFERENCES [employee](id)
)
最后,为了表达项目有员工的事实,添加一个链接表:
CREATE TABLE [project_employee] (
project_id INT REFERENCES [project](id),
employee_id INT REFERENCES [employee](id)
)
现在,对具有类似员工的项目的查询%beatrice%
只涉及联接和没有工会的单个员工。事实上,SQL Server 支持计算列,所以在表中添加一个计算列full_name
,[employee]
然后你就会有如下查询:
SELECT p.name, e.full_name
FROM project p
JOIN project_employee pe ON p.id = pe.project_id
JOIN employee e ON pe.employee_id = e.id
WHERE e.full_name LIKE '%beatrice%';
是的,我知道我的语法是错误的,但我希望你明白。要么规范化数据库,要么继续使用联合编写查询。
此外,如果您的员工 Jane Doe 与 Richard Roe 结婚并取她丈夫的名字,成为 Jane Roe,您需要做什么?使用您当前的数据库,您需要在表的所有列中搜索 Jane Doe 并更新它们。重新规范化,它只是更新表中的一行[employee]
。