2

我将不胜感激有关我真的无法理解的 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
         ------------------------------------------

我希望在 productcategories 或 regioncategories 中创建新行时像这样插入值。

新行已创建。

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

并且一条 SQL 语句将新值复制到主表中。

         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT      | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS        | NULL
         ------------------------------------------
VALUES:  EU         | DVD          | NULL
         ------------------------------------------

如果在区域类别中创建行也是如此。

新行。

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

复制到主表。

         ------------------------------------------
TABLE:   MASTERTABLE
         ------------------------------------------
COLUMNS: REGION     | PRODUCT       | ACCOUNT
         ------------------------------------------
VALUES:  EU         | BOOKS         | NULL
         ------------------------------------------
VALUES:  EU         | DVD           | NULL
         ------------------------------------------
VALUES:  US         | BOOKS         | NULL
         ------------------------------------------
VALUES:  US         | DVD           | NULL
         ------------------------------------------

我希望这是有道理的。

谢谢,

斯特凡

4

4 回答 4

2

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

SELECT  *
FROM    regiontable
CROSS JOIN
        producttable

它将更有效,因为与物化主表不同,这两个表都可能适合缓存。

如果由于某种原因您需要实现它,那么只需在两个表上编写触发器:

INSERT
INTO    mastertable
SELECT  r.code, NEW.code
FROM    regiontable t

mastertable,和

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

producttable

于 2010-04-04T09:54:03.763 回答
1

将额外信息插入 MASTERTABLE 有两种方法。

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

  2. 创建一个存储过程以将数据插入到 PRODUCTCATEGORIES 和 REGIONCATEGORIES 表中。然后存储过程负责检查 MASTERTABLE 并在必要时插入。

第二种方法的优点是维护您的代码的其他人可以清楚地看到正在发生的事情。触发器可以隐藏重要的功能。出于性能原因,存储过程通常是事务 SQL 的首选。

于 2010-04-04T09:52:03.483 回答
1

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

我知道您提到还有其他列。这些附加列包含什么?

我通常不会在规范化数据库上实现这样的表 - 除非您暗示需要在创建时以某种特殊方式分配的附加列,然后在某种维护中进行更改 - 即使在这种情况下,稀疏表(即仅偏离默认值)具有适当的默认值可以很好地工作。

我在我的一个系统中确实有一个类似的交叉连接,它包含大约 25m 行,并允许我们在有“行”和“列”的二维 2500 总分类帐帐户 x 10000 成本中心空间上替换非常复杂的逻辑逻辑相同,但逻辑“孤岛”。

于 2010-04-04T12:12:01.770 回答
0

好的,谢谢您的回答和建议。

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

这可能不是解决它的正确方法,但对于任何阅读的人来说可能会有用。

表结构是一样的,但是我对产品表和地区表都做了对应的表格。在表单 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

产品表:

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

编辑:对此事进行更多研究后,我发现如果您使用 SQL Server,如果您不想使用客户端设置,则这是您需要用于触发器的代码。

显然,在 SQL Server 中,当您想要获取插入行的值时,您需要引用一个名为“inserted”的隐藏表。查看此链接以获取更多信息:DML 触发器的多行注意事项

伟大的!

产品表:

-- 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;

地区表:

-- 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;
于 2010-04-05T11:55:31.123 回答