SQL:如何将两个表中的主键值插入到主表中

SQL:如何将两个表中的主键值插入到主表中,sql,insert,relational-database,Sql,Insert,Relational Database,如果能提供一些SQL语句方面的帮助,我将不胜感激 我想做的很简单,我需要从两个不同的表中获取值,并在将新行插入两个表之一时将它们复制到主表中 这个问题也许最好这样解释: 我有三个表,productcategories,regioncategories和mastertable --------------------------- TABLE: PRODUCTCATEGORIES --------------------------- COLUMNS: CO

如果能提供一些SQL语句方面的帮助,我将不胜感激

我想做的很简单,我需要从两个不同的表中获取值,并在将新行插入两个表之一时将它们复制到主表中

这个问题也许最好这样解释:

我有三个表,productcategories,regioncategories和mastertable

         ---------------------------
TABLE:   PRODUCTCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  BOOKS      | Books
         ---------------------------

         ---------------------------
TABLE:   REGIONCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  EU         | European Union
         ---------------------------

         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT       | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS         | NULL
         ------------------------------------------
         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT      | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS        | NULL
         ------------------------------------------
VALUES:  EU         | DVD          | NULL
         ------------------------------------------
         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT       | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS         | NULL
         ------------------------------------------
VALUES:  EU         | DVD           | NULL
         ------------------------------------------
VALUES:  US         | BOOKS         | NULL
         ------------------------------------------
VALUES:  US         | DVD           | NULL
         ------------------------------------------
我希望在productcategories或regioncategories中创建新行时,像这样插入值

将创建新行

         ---------------------------
TABLE:   PRODUCTCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  BOOKS      | Books
         ---------------------------
VALUES:  DVD        | DVDs
         ---------------------------
SQL语句将新值复制到主表中

         ---------------------------
TABLE:   PRODUCTCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  BOOKS      | Books
         ---------------------------

         ---------------------------
TABLE:   REGIONCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  EU         | European Union
         ---------------------------

         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT       | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS         | NULL
         ------------------------------------------
         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT      | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS        | NULL
         ------------------------------------------
VALUES:  EU         | DVD          | NULL
         ------------------------------------------
         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT       | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS         | NULL
         ------------------------------------------
VALUES:  EU         | DVD           | NULL
         ------------------------------------------
VALUES:  US         | BOOKS         | NULL
         ------------------------------------------
VALUES:  US         | DVD           | NULL
         ------------------------------------------
如果在regioncategories中创建了一行,情况也是如此

新的一排

         ---------------------------
TABLE:   REGIONCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  EU         | European Union
         ---------------------------
VALUES:  US         | United States
         ---------------------------
复制到主表

         ---------------------------
TABLE:   PRODUCTCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  BOOKS      | Books
         ---------------------------

         ---------------------------
TABLE:   REGIONCATEGORIES
         ---------------------------
COLUMNS: CODE       | DESCRIPTION
         ---------------------------
VALUES:  EU         | European Union
         ---------------------------

         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT       | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS         | NULL
         ------------------------------------------
         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT      | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS        | NULL
         ------------------------------------------
VALUES:  EU         | DVD          | NULL
         ------------------------------------------
         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT       | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS         | NULL
         ------------------------------------------
VALUES:  EU         | DVD           | NULL
         ------------------------------------------
VALUES:  US         | BOOKS         | NULL
         ------------------------------------------
VALUES:  US         | DVD           | NULL
         ------------------------------------------
我希望这是有道理的

谢谢


Stefan

有两种方法可以将额外信息插入主表

  • 使用触发器-当在PRODUCTCATEGORIES或REGIONCATEGORIES中发生插入时,将触发插入触发器并检查主表中是否存在该行。如果没有,则添加

  • 创建一个存储过程,将数据插入PRODUCTCATEGORIES和REGIONCATEGORIES表。然后,存储过程负责检查主表并在必要时插入

  • 第二种方法的优点是,维护代码的其他人很清楚正在发生什么。触发器可以隐藏重要的功能。出于性能原因,transact-SQL通常首选存储过程。

    您可以在运行时轻松构建“主表”:

    SELECT  *
    FROM    regiontable
    CROSS JOIN
            producttable
    
    它将更加高效,因为与物化主表不同,这两个表可能都适合缓存

    如果出于某种原因需要将其具体化,则只需在两个表上编写触发器:

    INSERT
    INTO    mastertable
    SELECT  r.code, NEW.code
    FROM    regiontable t
    
    主表上
    ,以及

    INSERT
    INTO    mastertable
    SELECT  NEW.code, p.code
    FROM    producttable p
    

    producttable

    上,主表似乎是所有潜在组合的交叉连接。因此,当您添加一个新区域时,您必须添加该区域中的所有潜在产品。对于可以简单地从所有潜在区域和所有潜在类别推断的数据来说,这是一项巨大的工作

    我知道你提到有额外的专栏。这些附加列包含什么

    我通常不会在规范化数据库中具体化这样一个表,除非您提到的附加列需要在创建时以某种特殊方式分配,然后在某种维护中进行更改,即使在这种情况下,也是稀疏表(即,仅与默认值不同)使用适当的默认值可以很好地工作


    我的一个系统中有一个类似的交叉连接,它包含大约2500万行,允许我们在2500个总账账户x 10000个成本中心的二维空间中替换非常复杂的逻辑,其中有相同逻辑的“行”和“列”,但有逻辑的“孤岛”,谢谢你的回答和建议

    我正在使用一个连接到MsSQL数据库的access项目。我试图用一个表触发器来解决这个问题,但没有一个建议能帮我解决这个问题。因此,我决定用VBA代码在客户端解决这个问题

    这可能不是解决这个问题的正确方法,但对任何阅读的人来说,了解它可能是有用的

    表结构是相同的,但我为product表和region表制作了相应的表单。在forms AfterInsert事件中,我有以下代码:

    区域表:

    Private Sub Form_AfterInsert()
    
    Dim varRegion As String
    Dim strSQL As String
    
    varRegion = Me![code]
    strSQL = "INSERT INTO master([region], [product]) SELECT '" & varRegion & "', & _
              [code] FROM product;"
    
        DoCmd.RunSQL strSQL
    
    End Sub
    
    -- Trigger statement
    CREATE TRIGGER "name-of-trigger"
    ON regiontable
    FOR INSERT AS
    
        -- Insert statement
    INSERT INTO mastertable ([product],[region])
    SELECT producttable.[code], inserted.[code]
    FROM producttable, inserted;
    
    产品表:

    Private Sub Form_AfterInsert()
    
    Dim varProduct As String
    Dim strSQL As String
    
    varProduct = Me![code]
    strSQL = "INSERT INTO master([region], [product]) SELECT [code], & _ 
              '" & varProduct & "' FROM region;"
    
        DoCmd.RunSQL strSQL
    
    End Sub
    
    -- Trigger statement
    CREATE TRIGGER "name-of-trigger"
    ON producttable
    FOR INSERT AS
    
        -- Insert statement
    INSERT INTO mastertable ([region],[product])
    SELECT regiontable.[code], inserted.[code]
    FROM regiontable, inserted;
    
    编辑:进一步研究了这个问题后,我发现如果您使用的是SQL Server,如果您不想使用客户端设置,那么这就是触发器需要使用的代码

    显然,在SQLServer中,当您想要获取插入行的值时,需要引用一个名为“inserted”的隐藏表。查看此链接以了解更多信息:

    太好了

    产品表:

    Private Sub Form_AfterInsert()
    
    Dim varProduct As String
    Dim strSQL As String
    
    varProduct = Me![code]
    strSQL = "INSERT INTO master([region], [product]) SELECT [code], & _ 
              '" & varProduct & "' FROM region;"
    
        DoCmd.RunSQL strSQL
    
    End Sub
    
    -- Trigger statement
    CREATE TRIGGER "name-of-trigger"
    ON producttable
    FOR INSERT AS
    
        -- Insert statement
    INSERT INTO mastertable ([region],[product])
    SELECT regiontable.[code], inserted.[code]
    FROM regiontable, inserted;
    
    区域表:

    Private Sub Form_AfterInsert()
    
    Dim varRegion As String
    Dim strSQL As String
    
    varRegion = Me![code]
    strSQL = "INSERT INTO master([region], [product]) SELECT '" & varRegion & "', & _
              [code] FROM product;"
    
        DoCmd.RunSQL strSQL
    
    End Sub
    
    -- Trigger statement
    CREATE TRIGGER "name-of-trigger"
    ON regiontable
    FOR INSERT AS
    
        -- Insert statement
    INSERT INTO mastertable ([product],[region])
    SELECT producttable.[code], inserted.[code]
    FROM producttable, inserted;
    

    哇-太快了。好的,创建一个存储过程似乎是一条出路。然而,对于实际的SQL语句应该是什么样子,我有点困惑,任何方向正确的点都会得到高度赞赏。嗨,也许我应该解释一下我在这个特定设置中的意图。我需要主表包含所有可能的变化,因为我希望稍后手动为每个变化分配一个值。该值表示订单登记到系统时应使用的销售帐户。假设我们有一位来自美国的客户购买了一本书,我希望用户能够将其设置到系统中,以便将订单登记到3030,这是国际销售帐户。@Stefan:为什么不仅在您想要分配值时插入一条记录?@Quassnoi:有效问题。系统不允许遗漏一个变量。也就是说,如果您添加一个新的产品类别或地区类别,您将需要为每个新的变体输入一个值。@Stefan:我只会在您知道销售帐户时填充帐户配置表行(即,让它稀疏,不允许空值),并对交叉联接与配置表运行异常过程/报告(即未找到的位置),在所有过帐操作之前,添加帐户配置的UI将使用相同的逻辑。我发现“.NEW”是MsSQL不理解的函数(与Oracle相反),因此我无法实现这一点,但我通过声明一个变量并按照下面的说明在VBA中运行SQL解决了这一问题。