是否可以在自联接表中附加查询

时间:2016-12-22 09:45:53

标签: sql ms-access ms-access-2010

我的tblEmployee包含3个字段:

  1. ID:自动编号
  2. Name:文字
  3. Supervisor:Number [作为tblEmployee中的查找]
  4. 我希望从tblNewEmployees向此表附加新数据,其结构与上一表完全相同。

    如果我将ID字段作为自动编号,是否可以这样做?

    我尝试了各种查询(例如,首先只将Name字段作为步骤1添加,然后尝试使用第二个更新查询来获取主管)但是所有产生的垃圾,因此我的问题是否可以使用AutoNumbers第一名。

2 个答案:

答案 0 :(得分:1)

我认为可以在您的结构(邻接列表模型)中以迭代方式完成,即将员工添加到树的顶部,查询数据库以获取其自动生成的ID,然后使用先前查询的ID添加下一级别的员工,然后重复每个级别。

虽然可能,但是可取吗?据推测,每个员工都有一个独特的身份证明,例如工资单号码,社会安全号码等。如果不确定,请询问工资单人员。

在生成员工ID时删除数据库的依赖关系可能会使您免于上述迭代过程。插入物最好是确定性的,可预测的,可以作为一次性使用等等。

要考虑的另一件事是,当您可能需要层次结构时,您可能正在建模树结构。 Celko曾经给出的例子:军队是一个等级制度,因为如果你射杀你的中士,你仍然需要接受你的船长的命令;另一方面,河流系统是树木,因为如果你的大坝是一个支流,那么所有下游支流都会干涸。

在我看来,你的设计,当一个主管离开(从表中删除)然后你留下一个无人监督的员工(缺少数据,因此数据完整性已损坏),而你想要下一个高级员工取代他们的位置(等级)。如果工作,你的结构中的更新可能会很多,即再次迭代。

虽然邻接列表模型可能很直观,但在SQL DML中并不总是最容易使用。考虑其他模型,嵌套集。也就是说,使用Access,SQL DML几乎总是很痛苦,因为它不支持存储过程,触发器等中的过程SQL代码;即使是简单的更新也可能由于“不可更新的查询”而失败。 (查看)限制。像往常一样,我必须建议你尽可能考虑更有能力的DBMS。

答案 1 :(得分:1)

是的,当目标表具有自动编号ID时,可以合并两个表。有两种可能的情况:

场景1:两个表之间的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数据库引擎允许我们将任意值插入AutoNumber列,因此这种情况很简单。只是......

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:两个表之间的公共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]列。