使用匹配的密钥从SQL中更新
如何在SQL中从更新?我想从我的使用匹配的密钥从SQL中更新,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,如何在SQL中从更新?我想从我的FamilyGuardian表中复制FamilyID: dbo.FamilyGuardian PupilID FamilyID GuardianID --------------------------------- 1 100002 555 2 100003 556 3 100004 557 4 100005 558 5 100006
FamilyGuardian
表中复制FamilyID
:
dbo.FamilyGuardian
PupilID FamilyID GuardianID
---------------------------------
1 100002 555
2 100003 556
3 100004 557
4 100005 558
5 100006 559
6 100007 1146
7 100008 561
8 100009 562
9 100010 563
10 100011 564
进入监护人表,其中GuardianID
相等
dbo.guarders
GuardianID Name FamilyID
---------------------------------
555 Smith NULL
556 Patel NULL
557 Andrews NULL
558 Brown NULL
559 Abdul NULL
dbo.guarders在之后插入FROM
GuardianID Name FamilyID
--------------------------------
555 Smith 100002
556 Patel 100003
557 Andrews 100004
558 Brown 100005
559 Abdul 100006
没有从插入的
这类东西-您要查找的是更新
,而不是插入
:
Update G
Set FamilyId = F.FamilyId
From FamilyGuardian F
Join Guardian G On G.GuardianId = F.GuardianId
您必须使用更新查询
UPDATE T1
SET T1.FamiltyID = T2.FamilyID
FROM dbo.Guardians AS T1 INNER JOIN dbo.FamilyGuardian AS T2
ON T1.GuardianID = T2.GuardianID
您可以为此使用可更新的CTE
但你必须意识到,这种设计是-嗯-弱
如果一个警卫负责一个以上的家庭,会发生什么?如果一方的信息发生变化,而另一方没有变化,会发生什么
我认为,这个根本不应该进入物理定义的列。每当您阅读此数据时,应使用连接。您的意思是更新,而不是插入,对吗
在这种情况下,您应该使用如下结构:
UPDATE dbo.Guardians
SET FamilyID = (SELECT DISTINCT FamilyID FROM dbo.FamilyGuardian fg WHERE fg.GuardianID = GuardianID )
请注意,只有当每个guardianId有超过1个familyId时,才需要使用DISTINCT。而不是您想要放置的TOP 1
。无论如何,我们必须意识到,如果在FamilyGuard
中可能有多个对应行,那么这种设计会出现严重问题。所有答案都会返回不可预测的结果,您的答案会遇到异常…为什么它会抛出异常?原因很简单,SELECT DISTINCT
将超过非唯一行(换句话说:将返回唯一行),但如果有更多行,它将不会返回一行。您每个guardianId写的familyId超过1个。正是在这种情况下,您会得到一个错误,因为使用sub-selectSET x=(subselect)
赋值必须在一行中返回一列(换句话说:scalar)。当然,谢谢。我没有把放在前1名
,因为在postgres中没有这样的指导,我试图让回答更笼统,尽管我犯了一个错误。嗨,亚历克斯,你接受了一个答案,这很好,但我觉得我自己必须指出,目前所有被高估的答案要么是错误的,要么是危险的。如果在FamilyGuardian
中每个GuardianID
可能有多行,则接受的答案将不可预测地设置您的FamilyID
。如果你可以肯定,这永远不会,你的桌子的设计是错误的。如果可能的话,你的桌子的设计也是错误的。。。
UPDATE dbo.Guardians
SET FamilyID = (SELECT DISTINCT FamilyID FROM dbo.FamilyGuardian fg WHERE fg.GuardianID = GuardianID )