有人可以仔细检查我的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)一个好的方法去或者是否有更好的连接尝试。
谢谢!
答案 0 :(得分: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在这种情况下会失败,并为Parent行返回两行。
<强>更新强>
拉里克说:至于value1和value2可能需要属于父表,那么对于每个ProposalNumber / AccountNumberKey组合,它们可能会有所不同。
在这种情况下,我给你的查询会得到奇怪的结果。您将如何确定AccountNumber使用哪组值?你会一直想要最新的ProposalNumber吗?您是否希望为每个不同的Value1和Value2集合查看一行?是否有另一个表要加入以找到要使用的当前ProposalNumber?
答案 1 :(得分:1)
首先,如果它是真的thjat“具有给定AccountNumberKey值的子记录将在它们的两个数字列中始终具有相同的值”,那么您的表模式不是正确的第三范式(3NF)。应该有另一个表格,每个AccountNumberKey
有一行,AccountNumberKey
为关键,Value1
和Value2
为数据字段,您的查询应该加入此表格(使用AccountNumberKey
)来检索Value1
和Value2
。
其次,在这种情况下,您不应将子表连接到父表列上的父表,该列是 而不是键 。这将导致笛卡尔积(其中输出将包括连接两侧的每一行的多行,实现对这些记录进行双倍或三倍计数...)AccountNumberKey
是父表的键吗?
如果不是,那么父表中唯一应该用作子表中FK的列是键列ParentID
。
如果 是 (如果AccountNumberKey
在父表中是唯一的),那么Value1和Value2列应该在父表中,而不是在父表中儿童表。
答案 2 :(得分:1)
您的加入不会产生这些结果,因为AccountNumberKey不是连接将产生的唯一
LocalHost 1873283 1100
4次,每个子记录一次,汇总后将产生4400作为值。