обновить значение столбца родительской таблицы по максимальному значению дочерней таблицы - PullRequest
0 голосов
/ 10 июня 2019

Это мои таблицы.

Table1

    Id     Name    DateTime   Flag
    ==========================
    1      Name1      -        0
    2      Name2      -        1
    3      Name3      -        1

Table2

    Id     Tb1Id   DateTime
    =======================
    1       1      20-09-2017
    2       1      01-09-2018
    3       2      01-09-2016
    4       2      02-09-2015 
    5       3      06-09-2016 
    6       3      10-09-2019

Я хочу объединить эти две таблицы, где Table1.Id = Table2.Tb1Idи получить максимальное значение даты и времени из таблицы 2, обновить это значение в столбце DateTime таблицы, где флаг таблицы 1 равен 1.

    Id     Name     DateTime
    ========================
    2      Name2    01-09-2016
    3      Name3    10-09-2019

Так я и пытался до сих пор.

UPDATE Table1
SET DateTime = 
(
SELECT MAX(T2.UpdatedAt) as UpdatedAt FROM Table1 AS T1
LEFT JOIN Table2 AS T2
ON T1.Id = T2.Tb1Id
WHERE T1.Flag = 1
GROUP BY T2.UpdatedAt
)

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Я бы использовал обновление присоединиться здесь:

UPDATE t1
SET DateTime = t2.MaxDateTime
FROM Table1 t1
INNER JOIN
(
    SELECT Tb1Id, MAX(DateTime) AS MaxDateTime
    FROM Table2
    GROUP BY Tb1Id
) t2
    ON t1.Id = t2.Tb1Id
WHERE
    t1.Flag = 1;

Проблема с вашим текущим запросом заключается в том, что он никогда не соотносил записи во внешнем обновлении на Table1 с чем-либо происходящим внутри предложения SET. Но я бы использовал здесь обновление, потому что его легче читать.

Обратите внимание, что если вы считаете, что вам придется часто запускать это обновление, вы можете рассмотреть возможность использования запроса / представления, в котором сообщается о максимальных датах из второй таблицы вместе с данными из первой таблицы.

1 голос
/ 10 июня 2019

Это просто ПРИСОЕДИНЕНИЕ, как

CREATE TABLE T1(
  ID INT,
  Name VARCHAR(45),
  Date_Time DATETIME,
  Flag INT
);

INSERT INTO T1 (ID, Name, Flag) VALUES
(1, 'Name1', 0),
(2, 'Name2', 1),
(3, 'Name3', 1);

CREATE TABLE T2(
  ID INT,
  Tb1Id INT,
  Date_Time DATETIME
);

INSERT INTO T2 VALUES
(1, 1, '2017-09-20'),
(2, 1, '2018-01-09'),
(3, 2, '2016-09-01'),
(4, 2, '2015-09-02'), 
(5, 3, '2016-09-06'), 
(6, 3, '2019-09-10');

;WITH CTE AS
(
  SELECT T1.ID,
         T1.Name, --You can remove this cause I thought you want a SELECT
         MAX( T2.Date_Time ) Date_Time
  FROM T1 INNER JOIN T2
  ON T1.Id = T2.Tb1Id
  WHERE T1.Flag = 1
  GROUP BY T1.ID,
           T1.Name --And this one too
)
UPDATE T1
SET Date_Time = CTE.Date_Time
FROM T1 INNER JOIN CTE
ON T1.Id = CTE.Id;

SELECT *
FROM T1;

Возвращает:

+----+-------+---------------------+------+
| ID | Name  |      Date_Time      | Flag |
+----+-------+---------------------+------+
|  1 | Name1 |                     |    0 |
|  2 | Name2 | 01/09/2016 00:00:00 |    1 |
|  3 | Name3 | 10/09/2019 00:00:00 |    1 |
+----+-------+---------------------+------+

Демонстрация в реальном времени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...