根据另一个表中另一列的内容更新表列

时间:2019-11-28 22:17:18

标签: sql-server sql-update

我有下面的表格(为简化起见,我仅显示其中一部分表格作为示例,而不是全部内容):

CREATE TABLE InstArtRel
(
    id INT IDENTITY(1, 1) NOT NULL,
    idIns INT,
    ExpDateRev DATE,
    codArticle NVARCHAR(4),

    PRIMARY KEY (id)
);

INSERT INTO InstArtRel (idIns, ExpDateRev, codArticle) 
VALUES (17400, datefromparts(2018, 10, 1), 'X509'),
       (17400, datefromparts(2020, 12, 2), 'X529'),
       (17400, datefromparts(2016, 9, 10), 'T579'),
       (17400, datefromparts(2017, 6, 7), 'Z669'),
       (10100, datefromparts(2019, 8, 17), 'TG09'),
       (10100, datefromparts(2018, 3, 28), 'TG09'),
       (10100, datefromparts(2018, 4, 24), 'TG09'),
       (10100, datefromparts(2016, 7, 12), 'TG09');        


CREATE TABLE Installations 
(
    idIns INT NOT NULL,
    DateIns DATETIME,

    PRIMARY KEY (idIns)
);       

INSERT INTO Installations (idIns, DateIns)
VALUES (17400, '2020-12-01'),
       (10100, '2022-05-07');    

对于表“安装”中的每个idIn,我需要根据以下假设,用DateIns表中的ExpDateRev列更新其InstArtRel列:

  • 如果codArticle表中IdIns的所有InstArtRel列值都相同,则表DateIns中的Installations列将被更新对应的idIns的最大值为ExpDateRev

  • 否则,如果codArticle表中的IdIns的所有InstArtRel列值都不相同,则表{{1}中的DateIns列}将使用最小值Installations为相应的idIns更新。

一个更好的例子...考虑到上述情况,在这种情况下的结果将是:

ExpDateRev

1 个答案:

答案 0 :(得分:1)

带有Aggregate的{​​{1}}将为您提供帮助。

查询:

CASE

输出:

SELECT idIns,CASE WHEN COUNT(DISTINCT codArticle) = 1 THEN MAX(ExpDateRev)
            WHEN COUNT(DISTINCT codArticle) != 1 THEN MIN(ExpDateRev) END DateIns
FROM InstArtRel
GROUP BY idIns

更新查询:

| idIns |    DateIns |
|-------|------------|
| 10100 | 2019-08-17 |
| 17400 | 2016-09-10 |

SQL Fiddle link