我有两个不同的数据库,位于同一列。我想通过比较表之间的编号并使用相同的编号将图片从旧数据库复制到新数据库。
例如:
数据库名称1:StudentInformation
,表名称:Student
StudentID Image
---------------------
123 1.png
142 2.png
175 3.png
475 4.png
数据库名称2:StudentInformation2
,表名称:NewStudent
StudentID Image
--------------------------
145 a14.png
196 7.png
175 5.png
875 9.png
475 12.png
两个表具有通用ID(ID = 175和ID = 475)
我希望得到此表:
StudentID Image
-----------------------
145 a14.png
196 7.png
175 3.png
875 9.png
475 4.png
我写了这个查询:
INSERT INTO NEW STUDENT
SELECT STUDENT ID
FROM STUDENT
WHERE STUDENT INFORMATION1.STUDENT ID = STUDENT INFORMATION2.STUDENTID
但是它没有运行。如何通过比较旧表和新表的ID值来编写SQL以将图像添加到公共ID列中?
答案 0 :(得分:0)
尚不清楚第二个样本中的-
值是否确实是数据中的那个字符,还是仅代表NULL
。在这个答案中,我假设是后者。
首先要了解的是您不能在表名和列名中保留空格。最好不要在表名和列名中完全使用空格,但是如果有必要,您可以至少将这些名称括在方括号中,例如:[NEW STUDENT]
。
接下来,您已经具有StudentID值175和475的数据,因此这根本不是INSERT命令。这将是一个 UPDATE 命令。
现在,假设数据库位于同一服务器上或已存在链接服务器,并且您的连接具有对两个数据库的必需特权,那么您将必须完全限定所有条件,包括架构(几乎总是dbo
)。
将所有内容放在一起,就会得到:
UPDATE n /* n = new, o = old */
SET n.Image = o.Image
FROM StudentInformation2.dbo.NewStudent n
INNER JOIN StudentInformation.dbo.Student o ON o.StudentID = n.StudentID
-- removed WHERE clause based on a comment to the question. The o
--WHERE n.Image IS NULL
答案 1 :(得分:-1)
您想要一个UPDATE
来更改现有行,而不是INSERT
来创建新行。为此,您可以使用关联的子查询来获取具有共享ID的旧表的图像。要确保仅更新旧表中存在行的行,请使用带有EXISTS
的相关子查询。否则,您会将没有旧记录的行的图像设置为NULL
。
UPDATE studentinformation2.dbo.newstudent
SET image = (SELECT student.image
FROM studentinformation.dbo.student
WHERE student.studentid = newstudent.studentid)
WHERE EXISTS (SELECT *
FROM studentinformation.dbo.student
WHERE student.studentid = newstudent.studentid);
我假设两个数据库中表的架构均为dbo
。如果不是这种情况,则必须更改架构标识符以反映实际情况。
答案 2 :(得分:-1)
如果您使用的是Microsoft sql服务器,则可以与此一起插入新数据
INSERT INTO NEW_STUDENT (ID,Image)
SELECT student.ID, stundet.Image
FROM STUDENT left join NEW_STUDENT on NEW_STUDENT.StundetID = Student.ID
where newstudent.ID is null
要更新数据,请使用此
update newstudent set id = student.id,image = student.image
SELECT student.ID, stundet.Image
FROM STUDENT inner join NEW_STUDENT on NEW_STUDENT.StundetID = Student.ID