更新表1,从表2中添加值

时间:2018-05-22 18:38:37

标签: sql-server

  Table1
  Columns     PK_Table1   Name | DoYouGoToSchool |DoYouhaveACar |DoYouWorkFullTime | DoYouWorkPartTime  |  Score
                1          joe     Yes               Yes              No                   Yes   
                2          amy     No                Yes              Yes                  No    



 Table2      
  Columns     Pk_Table2   |Question                   | Answer(Bit Column)   |Value 
                1          DoYouGoToSchool              True                   3
                2          DoYouhaveACar                True                   2                
                3          DoYouWorkFullTime            True                   4
                4          DoYouWorkPartTime            True                   2

基于Table2中的信息我需要做的是UPDATE Table1 ColumnName得分,将Table2中的值与他提供的信息相加。

        for example i expect the Score column in table1 to be 7 for record 1 
                                                        and   5 for record 2  

以下是与

一起使用的查询
IF OBJECT_ID('tempdb..#Table2') IS NOT NULL DROP TABLE #Table2
GO
IF OBJECT_ID('tempdb..#Table1') IS NOT NULL DROP TABLE #Table1

GO

create table #Table1
(
    PK_Table1               int, 
    Name            Varchar(50), 
    DoYouGoToSchool  Varchar(8),
    DoYouhaveACar    Varchar(8),
    DoYouWorkFullTime Varchar(8),
    DoYouWorkPartTime Varchar(8),
    Score             INT NULL,
)

create table #Table2
(
    PK_Table2               int, 
    Questions      Varchar(50), 
    Answer         BIT NOT NULL DEFAULT(0),
     VALUE         INT NULL 
)


INSERT INTO #Table1 (Name,DoYouGoToSchool,DoYouhaveACar,DoYouWorkFullTime,DoYouWorkPartTime)
VALUES ('joe','Yes','Yes','No','Yes'), ('amy','NO','Yes','Yes','No')
INSERT INTO #Table2(Questions,Answer,VALUE)
VALUES ('DoYouGoToSchool','True',3 ),('DoYouhaveACar','True',2 ),('DoYouWorkFullTime','True',4 ),('DoYouWorkPartTime','True',2 )

这是下面的答案中缺少的,它告诉您为表2创建新的FK约束 - 使用新的FK列将数据插入表中

insert into #Table2 (FK_Table1, Questions, Answer) select t.PK_Table1, t1.cols, colsval from #Table1 t cross apply (values (PK_Table1,'DoYouGoToSchool', DoYouGoToSchool), (PK_Table1,'DoYouhaveACar', DoYouhaveACar), (PK_Table1,'DoYouWorkFullTime', DoYouWorkFullTime), (PK_Table1,'DoYouWorkPartTime', DoYouWorkPartTime) ) t1 (PK_Table1,cols, colsval);

2 个答案:

答案 0 :(得分:0)

首先在这两个表之间创建一个关系,并将Table2中Table1的主键作为外键添加,以便Table2变为:

Table2 Columns:     
FK_Table1    |Pk_Table2   |Question                   | Answer(Bit Column)   |Value 
    1           1          DoYouGoToSchool              True                   3
    1           2          DoYouhaveACar                True                   2
    1           3          DoYouWorkFullTime            True                   4
    1           4          DoYouWorkPartTime            True                   2

您可以使用此查询添加表格:

ALTER TABLE Table2
    ADD FK_Table1 INTEGER,
    ADD CONSTRAINT FOREIGN KEY(FK_Table1) REFERENCES Table1(PK_Table1)

表示仅适用于PK_Table1 = 1

的人

然后你可以从这个查询中提取他的分数:

SELECT Sum(Value) FROM Table2 WHERE FK_Table1 = 1;

然后更新查询:

UPDATE Table1
SET score = (enter here the returned score from above query)
WHERE PK_Table1 = 1;

或者您可以在单个查询中执行此操作:

UPDATE Table1
SET score = (SELECT Sum(Value) FROM Table2 WHERE FK_Table1 = 1)
WHERE PK_Table1 = 1;

答案 1 :(得分:0)

您需要添加另一个表格。该表将是您的关系表。它可以被称为Table1_Table2,有三列。第一列将是表的主键。下一列将是Table1的主键,第三列将是表2的主键。

当Table2的实例出现与Table1相关时,将一条记录插入Table1_Table2中,该记录将两个表以及彼此的主键相关联。然后可以在关系表Table1_Table2上进行查询,该表允许您对关系求和。

|Table1_Table2 | | PK | PK_Table1 | PK_Table2 | | 1 | 1 | 1 | | 2 | 1 | 3 | | 3 | 2 | 1 | | 4 | 2 | 4 |

正如我们所看到的,我们现在可以在Table1上执行更新

UPDATE TABLE1 A SET A.SCORE = (Select SUM(B.Value) FROM Table2 B, Table1_Table2 C WHERE C.PK_Table2 = B.PK_Table2 AND C.PK_Table1 = A.PK_Table1);