Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用匹配的密钥从SQL中更新_Sql_Sql Server_Database_Tsql - Fatal编程技术网

使用匹配的密钥从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

如何在SQL中从更新?我想从我的
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-select
SET x=(subselect)
赋值必须在一行中返回一列(换句话说:scalar)。当然,谢谢。我没有把
放在前1名
,因为在postgres中没有这样的指导,我试图让回答更笼统,尽管我犯了一个错误。嗨,亚历克斯,你接受了一个答案,这很好,但我觉得我自己必须指出,目前所有被高估的答案要么是错误的,要么是危险的。如果在
FamilyGuardian
中每个
GuardianID
可能有多行,则接受的答案将不可预测地设置您的
FamilyID
。如果你可以肯定,这永远不会,你的桌子的设计是错误的。如果可能的话,你的桌子的设计也是错误的。。。
UPDATE dbo.Guardians
SET FamilyID = (SELECT DISTINCT FamilyID FROM dbo.FamilyGuardian fg WHERE fg.GuardianID  = GuardianID )