4

有人可以仔细检查我的 SQL 语句是否正确操作和一般常识方法吗?

这是发生了什么:我有一个具有一对多关系的父表和子表,连接到一个名为 AccountNumberKey 的列上。子表中有数字列,我需要总结一下。

数据使得具有给定 AccountNumberKey 值的所有子记录在它们的两个数字列中始终具有相同的值。我想加入这些表,并为每个 AccountNumberKey 将这两列的总和放入一个临时表中。我只需要对给定每个 AccountNumberKey 的单个子记录中的列求和。

下面的一些示例数据将(我希望)使这一点更清楚:

Parent Table Columns


ParentID    InstitutionID    AccountNumberKey  

1       LocalHost            1873283  
2       Acme Brokers         3627389    
3       Dewey, Cheatem       1392876
4       NCC1701              8837273
5       Peyton Place         9981273


Child Table Columns


ChildID     AccountNumberKey    Value1      Value2       ProposalNumber
1               1873283         1000        100         58
2               1873283         1000        100         59
3               1873283         1000        100         60
4               1873283         1000        100         61

这是我的 SQL 语句:

    SELECT   DISTINCT  Parent.InstitutionID, AccountNumberKey, SUM(Child.Value1 + Child.Value2) as total
        INTO   #TempTable
        FROM         Parent 
            INNER JOIN
              Child ON Parent.AccountNumberKey = Child.AccountNumberKey 

        GROUP BY Parent.InstitutionID, Parent.AccountNumberKey, Child.ProposalNumber

目标是链接表并将数据放入临时表中,如下所示:

TempTable columns


InstitutionID       AccountNumberKey        Total
LocalHost           1873283             1100

我的 SQL 查询是否通过了集合?在分组方面,我不是天才,我想知道这是否是 A) 正确和 B) 一个好的方法,或者是否有更好的连接可以尝试。

谢谢!

4

3 回答 3

3

此查询将给出您似乎想要的结果:

SELECT
   P.InstitutionID,
   P.AccountNumberKey,
   Total = C.Value1 + C.Value2
FROM
   Parent P
   INNER JOIN (
      SELECT DISTINCT AccountNumberKey, Value1, Value2
      FROM Child
   ) C ON P.AccountNumberKey = C.AccountNumberKey

但我想回应其他人所说的:如果你可以对设计做任何事情,你应该做,因为它没有标准化。Child 表中的 Value1 和 Value2 确实属于 Parent 表,因为它们是关于 Parent 的。如果 Child 表中的两行具有相同 AccountNumberKey 的不同值集怎么办?您的数据将全是错误的,谁知道可能对业务造成什么样的灾难性后果?在这种情况下,上面的 DISTINCT 将失败并为父行返回两行。

更新:

larryq 说:

至于 value1 和 value2 可能需要属于父表,在路上它们可能会因每个 ProposalNumber/AccountNumberKey 组合而不同。

在这种情况下,我给你的查询会给出奇怪的结果。您将如何决定为 AccountNumber 使用哪一组值?你总是想要最新的 ProposalNumber 吗?您想为每组不同的 Value1 和 Value2 查看一行吗?是否有另一个表要加入以查找当前要使用的 ProposalNumber?

于 2010-02-06T01:55:41.593 回答
1

首先,如果确实“具有给定 AccountNumberKey 值的子记录在它们的两个数字列中将始终具有相同的值”,那么您的表架构不是正确的第三范式(3NF)。应该有另一个表,每行一个AccountNumberKeyAccountNumberKey作为键,Value1Value2作为数据字段,并且您的查询应该连接到该表(使用AccountNumberKey),以检索 Value1Value2

其次,在这种情况下,您不应该在不是 Key的父表列上将子表连接到父表。这将导致笛卡尔积(其中输出将包括连接两侧的每一行的多行,实际上对这些记录进行双重或三重计算......)是AccountNumberKey父表的键吗?

如果不是,则父表中唯一应该用作子表中的 FK 的列是 key column ParentID

如果(如果AccountNumberKey在父表中是唯一的),那么 Value1 和 Value2 列应该在父表中,而不是在子表中。

于 2010-02-06T01:16:45.937 回答
1

您的联接不会产生这些结果,因为 AccountNumberKey 不是唯一的联接会产生

LocalHost           1873283             1100

4 次,每个子记录一个,聚合时将产生 4400 作为值。

于 2010-02-06T01:25:49.110 回答