是否可以在自连接 table 中追加查询
Are Append Queries in a self joining table possible
我有 tblEmployee
包含 3 个字段:
ID
: 自动编号
Name
: 文字
Supervisor
:数字[作为在 tblEmployee 中的查找]
我希望将来自 tblNewEmployees
的新数据附加到此 table,其结构与之前的 table.
完全相同
如果我将 ID 字段作为自动编号,可以这样做吗?
我尝试了各种查询(例如,首先仅在步骤 1 中附加 Name 字段,然后尝试使用第二个更新查询来获取主管),但都产生了垃圾,因此我的问题是这是否可以使用 AutoNumbers首先。
我想这可以在您的结构(邻接列表模型)中以迭代方式完成,即将员工添加到树的顶部,查询数据库以获取他们自动生成的 ID ,然后使用先前查询的 ID 添加下一个级别的员工,然后对每个级别重复以下操作。
虽然可能,但是否可取?大概每个员工都已经有一个唯一的 ID,例如工资单号码、社会安全号码等。如果不确定,请询问工资单人员。
删除数据库在生成员工 ID 时的依赖性可能会使您从上述迭代过程中解脱出来。插入最好是确定性的、预测的table、一次性可写的等等
另一件需要考虑的事情是,当您可能需要层次结构时,您可能正在为树结构建模。 Celko 曾经举过的例子:军队是有等级制度的,因为如果你射杀了你的中士,你仍然必须听从上尉的命令;另一方面,河流系统是树,因为如果你在一条支流上建坝,那么所有下游支流 运行 干涸。
在我看来,你的设计是,当主管离开(从 table 中删除)时,你将留下一个无人监督的员工(丢失数据,因此数据完整性被破坏),而你' d 希望下一位高级员工接替他们的位置(等级制度)。如果工作即再次迭代,您的结构中的更新可能会很多。
虽然邻接表模型可能很直观,但在 SQL DML 中使用它并不总是最容易的。考虑其他模型,例如嵌套集。也就是说,对于 Access,SQL DML 几乎总是很痛苦,因为它不支持存储过程、触发器等中的过程 SQL 代码;由于 'non-updatable query'(视图)限制,即使是简单的更新也可能失败。因此,像往常一样,我必须建议您尽可能考虑功能更强大的 DBMS。
是的,当目的地 table 具有自动编号 ID 时,可以合并两个 table。有两种可能的情况:
场景 1:两个 tables
之间的 ID 值没有重叠
[tblEmployee]
ID Name Supervisor
-- ---------- ----------
1 Director A
2 Manager A 1
3 Worker A 2
[tblNewEmployees]
ID Name Supervisor
--- ---------- ----------
101 Director B
102 Manager B 101
103 Worker B 102
由于 Access 数据库引擎允许我们将任意值插入到自动编号列中,因此这种情况很简单。只是...
INSERT INTO tblEmployee (ID, [Name], Supervisor)
SELECT ID, [Name], Supervisor FROM tblNewEmployees
...我们完成了:
[tblEmployee]
ID Name Supervisor
--- ---------- ----------
1 Director A
2 Manager A 1
3 Worker A 2
101 Director B
102 Manager B 101
103 Worker B 102
场景 2:两个 tables
之间的公共 ID 值
[tblEmployee]
ID Name Supervisor
-- ---------- ----------
1 Director A
2 Manager A 1
3 Worker A 2
[tblNewEmployees]
ID Name Supervisor
-- ---------- ----------
2 Director B
5 Manager B 2
7 Worker B 5
在这种情况下,我们需要在插入新行时将旧 ID 值映射到新 ID 值。为此,向 [tblEmployee]
添加一个新列
ALTER TABLE tblEmployee ADD oldID LONG
然后插入新行,将 tblNewEmployees.ID 放入 tblEmployee.oldID
INSERT INTO tblEmployee (oldID, [Name])
SELECT ID, [Name] FROM tblNewEmployees
给我们
[tblEmployee]
ID Name Supervisor oldID
-- ---------- ---------- -----
1 Director A
2 Manager A 1
3 Worker A 2
4 Director B 2
5 Manager B 5
6 Worker B 7
然后我们可以用新的 ID 值更新 Supervisor 列
UPDATE
(
tblEmployee emp
INNER JOIN
tblNewEmployees new
ON emp.oldID = new.ID
)
INNER JOIN
tblEmployee emp2
ON new.Supervisor = emp2.oldID
SET emp.Supervisor = emp2.ID
生产
[tblEmployee]
ID Name Supervisor oldID
-- ---------- ---------- -----
1 Director A
2 Manager A 1
3 Worker A 2
4 Director B 2
5 Manager B 4 5
6 Worker B 5 7
然后,如果需要,我们可以删除 [oldID] 列。
我有 tblEmployee
包含 3 个字段:
ID
: 自动编号Name
: 文字Supervisor
:数字[作为在 tblEmployee 中的查找]
我希望将来自 tblNewEmployees
的新数据附加到此 table,其结构与之前的 table.
如果我将 ID 字段作为自动编号,可以这样做吗?
我尝试了各种查询(例如,首先仅在步骤 1 中附加 Name 字段,然后尝试使用第二个更新查询来获取主管),但都产生了垃圾,因此我的问题是这是否可以使用 AutoNumbers首先。
我想这可以在您的结构(邻接列表模型)中以迭代方式完成,即将员工添加到树的顶部,查询数据库以获取他们自动生成的 ID ,然后使用先前查询的 ID 添加下一个级别的员工,然后对每个级别重复以下操作。
虽然可能,但是否可取?大概每个员工都已经有一个唯一的 ID,例如工资单号码、社会安全号码等。如果不确定,请询问工资单人员。
删除数据库在生成员工 ID 时的依赖性可能会使您从上述迭代过程中解脱出来。插入最好是确定性的、预测的table、一次性可写的等等
另一件需要考虑的事情是,当您可能需要层次结构时,您可能正在为树结构建模。 Celko 曾经举过的例子:军队是有等级制度的,因为如果你射杀了你的中士,你仍然必须听从上尉的命令;另一方面,河流系统是树,因为如果你在一条支流上建坝,那么所有下游支流 运行 干涸。
在我看来,你的设计是,当主管离开(从 table 中删除)时,你将留下一个无人监督的员工(丢失数据,因此数据完整性被破坏),而你' d 希望下一位高级员工接替他们的位置(等级制度)。如果工作即再次迭代,您的结构中的更新可能会很多。
虽然邻接表模型可能很直观,但在 SQL DML 中使用它并不总是最容易的。考虑其他模型,例如嵌套集。也就是说,对于 Access,SQL DML 几乎总是很痛苦,因为它不支持存储过程、触发器等中的过程 SQL 代码;由于 'non-updatable query'(视图)限制,即使是简单的更新也可能失败。因此,像往常一样,我必须建议您尽可能考虑功能更强大的 DBMS。
是的,当目的地 table 具有自动编号 ID 时,可以合并两个 table。有两种可能的情况:
场景 1:两个 tables
之间的 ID 值没有重叠[tblEmployee]
ID Name Supervisor
-- ---------- ----------
1 Director A
2 Manager A 1
3 Worker A 2
[tblNewEmployees]
ID Name Supervisor
--- ---------- ----------
101 Director B
102 Manager B 101
103 Worker B 102
由于 Access 数据库引擎允许我们将任意值插入到自动编号列中,因此这种情况很简单。只是...
INSERT INTO tblEmployee (ID, [Name], Supervisor)
SELECT ID, [Name], Supervisor FROM tblNewEmployees
...我们完成了:
[tblEmployee]
ID Name Supervisor
--- ---------- ----------
1 Director A
2 Manager A 1
3 Worker A 2
101 Director B
102 Manager B 101
103 Worker B 102
场景 2:两个 tables
之间的公共 ID 值[tblEmployee]
ID Name Supervisor
-- ---------- ----------
1 Director A
2 Manager A 1
3 Worker A 2
[tblNewEmployees]
ID Name Supervisor
-- ---------- ----------
2 Director B
5 Manager B 2
7 Worker B 5
在这种情况下,我们需要在插入新行时将旧 ID 值映射到新 ID 值。为此,向 [tblEmployee]
添加一个新列ALTER TABLE tblEmployee ADD oldID LONG
然后插入新行,将 tblNewEmployees.ID 放入 tblEmployee.oldID
INSERT INTO tblEmployee (oldID, [Name])
SELECT ID, [Name] FROM tblNewEmployees
给我们
[tblEmployee]
ID Name Supervisor oldID
-- ---------- ---------- -----
1 Director A
2 Manager A 1
3 Worker A 2
4 Director B 2
5 Manager B 5
6 Worker B 7
然后我们可以用新的 ID 值更新 Supervisor 列
UPDATE
(
tblEmployee emp
INNER JOIN
tblNewEmployees new
ON emp.oldID = new.ID
)
INNER JOIN
tblEmployee emp2
ON new.Supervisor = emp2.oldID
SET emp.Supervisor = emp2.ID
生产
[tblEmployee]
ID Name Supervisor oldID
-- ---------- ---------- -----
1 Director A
2 Manager A 1
3 Worker A 2
4 Director B 2
5 Manager B 4 5
6 Worker B 5 7
然后,如果需要,我们可以删除 [oldID] 列。