SQL-从另一个表

时间:2016-05-06 07:28:45

标签: sql ms-access ms-access-2013

我已经阅读了几个相关问题的答案,但没有一个可以适用于这种情况。

我有一张表TableA,其中列出了几个组,其得分为:

GROUP|SCORE

Blue | 0      
Green| 0      
Red  | 0      
Orange| 0 

在另一张表TableB上,我有每组的部分及其个人得分(状态),它们可以有三个不同的值:

 - G (Good)
 - A (Average)
 - B (Bad)

所以tableB是:

GROUP|PART|STATUS

Blue | 3H2| A  
Blue | 4NQ| G  
Blue | W9X| A  
Green| 65D| G  
Red  | 73F| B  
Red  | 91G| A  

我需要通过以下方式更新TableA上的分数:

  • 如果群组各部分之间的最佳状态为G,则群组得分为3
  • 如果群组各部分之间的最佳状态为A,则群组分数为2
  • 如果群组各部分之间的最佳状态为B,则群组分数为1

我已经花了几天时间来解决这个问题,但我无法找到解决方案。感谢你们。顺便说一下,我正在使用Access 2013。

2 个答案:

答案 0 :(得分:2)

正如我在评论中已经提到的:不要冗余地存储分数;它隐含在tableB中。为了直接获取数据库,请引入状态表:

STATUS   DESCRIPTION   SCORE
G        Good          3
A        Avarage       2
B        Bad           1

如果要为每个颜色组选择分数,请使用此查询:

select b.colorgroup, max(s.score) as maxscore
from tableb as b
join status as s on s.status = b.status
group by b.colorgroup;

编写同一查询的两种替代方法:

select 
  colorgroup, 
  (
    select max(score)
    from status as s
    where s.status = b.status
  ) as maxscore
from tableb as b;

select b.colorgroup, s.maxscore
from tableb as b
join 
(
  select status, max(score) as maxscore
  from status
  group by status
) as s on s.status = b.status;

(顺便说一句:我打电话给你的小组colorgroup,因为GROUP是SQL中的保留名称。)

更新您说您无法将表添加到数据库中。因此,您必须不幸地评估查询本身的分数。在标准SQL中,您将使用CASE WHEN,MS Access不具备此功能。 MS Access提供IIF代替:

select 
  colorgroup, 
  max(iif(status = 'G', 3, iif(status = 'A', 2, 1))) as maxscore
from tableb
group by colorgroup;

如果您甚至必须使用tableA中的列并进行冗余存储,请使用:

update tablea as a
set score =
(
  select 
    max(iif(status = 'G', 3, iif(status = 'A', 2, 1))) as maxscore
  from tableb as b
  where b.colorgroup = a.colorgroup
);

答案 1 :(得分:0)

SQL-Server 中,您可以执行以下操作:

<强> QUERY

update a
set a.SCORE = MaxSTATUS
from #a a
join  (select GROUP_, MAX(case when b.STATUS_ = 'G' then 3
                               when b.STATUS_ = 'A' then 2
                               when b.STATUS_ = 'B' then 1
                           end) MaxSTATUS
        from #b b
        group by GROUP_

) b ON a.GROUP_ = b.GROUP_

select * from #a 

示例数据

CREATE TABLE #a
(
GROUP_ NVARCHAR(60),
SCORE INT
)
INSERT INTO #a VALUES
  ('Blue',0)
 ,('Green',0)
 ,('Red',0)
 ,('Orange',0)

CREATE TABLE #b
(
GROUP_ NVARCHAR(60),
PART NVARCHAR(60),
STATUS_ NVARCHAR(60),
)
INSERT INTO #b VALUES
  ('Blue','3H2','A')
 ,('Blue','4NQ','G')
 ,('Blue','W9X','A')
 ,('Green','65D','G')
 ,('Red','73F','B')
 ,('Red','91G','A')

<强> OUPUT

GROUP_  SCORE
Blue    3
Green   3
Red     2
Orange  0