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