如何比较不同的数据库表列并在SQL Server中添加?

时间:2018-10-03 17:19:12

标签: sql sql-server

我有两个不同的数据库,位于同一列。我想通过比较表之间的编号并使用相同的编号将图片从旧数据库复制到新数据库。

例如:

数据库名称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列中?

3 个答案:

答案 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