2013-08-27 8 views
0

Этот вопрос связи на мой предыдущий вопрос:Обновление столбцов из одной таблицы с соответствующими значениями столбцов из другой таблицы

Updating only ID's with the latest date SQL (2 of 6)

У меня есть следующие 2 таблицы:

Table1 and Table2

Я уже есть этот запрос, который обновляет идентификаторы в таблице 1, где найдена только самая последняя дата. Однако возможно ли сопоставить соответствующие идентификаторы в таблице 1 с соответствующими идентификаторами в таблице2 на основе даты.

Пожалуйста, смотрите мой запрос ниже:

Update Dairy 
SET DY_H_ID = (
       SELECT MAX(ID) 
       FROM History 
       WHERE H_DateTime <= DY_Date 
       AND H_IDX = DY_IDX 
       AND H_HA_ID = 7 
       AND H_HSA_ID = 19 
       AND H_Description LIKE 'Diary item added for :%' 
      ) 
WHERE DY_H_ID IS NULL 
AND DY_IDX IS NOT NULL 
AND DY_Date = (SELECT MAX(DY_Date) FROM Dairy) 

Я хотел бы сделать что-то вроде этого, чтобы соответствовать остальной вверх, однако это не работает:

AND SUBSTRING(CAST(DY_Date AS varchar(11)), 1, 10) = (SELECT SUBSTRING(CAST(H_DateTime AS varchar(11)), 1, 10) FROM History) 

Э.Г. ID 10029 в таблице 1 должен получить ID 3205 из Истории. ID 10030 должен получить идентификатор 3206, ID 10031 должен получить ID 3207, ID 10032 должен получить 3208 и т. Д.

Обратите внимание, что значения в обоих таблицах будут изменены.

+0

Зачем вам нужно использовать SUBSTRING? Когда вы преобразите даты в Varchar (11), элемент времени больше не существует. – Gidil

+0

И это отдельное ОБНОВЛЕНИЕ или часть предыдущего? – Gidil

+0

Привет @Gidil, это часть предыдущего обновления. Да, это правда. Мне, вероятно, не нужно использовать SUBSTRING. – frans

ответ

1

Я нашел его! Спасибо @Secret Squirrel и @Gidil за то, что указали мне в правильном направлении.

;WITH cte AS (
    SELECT H_IDX, MAX(ID) MaxID, SUBSTRING(H_Description, 24, 10) AS [Date] 
    FROM History 
    WHERE H_HA_ID = 7 
      AND H_HSA_ID = 19 
      AND H_Description LIKE 'Diary item added for :%' 
    GROUP BY H_IDX, H_DateTime, H_Description 
) 
Update Dairy 
SET DY_H_ID = MaxID 
FROM Dairy 
INNER JOIN CTE ON cte.H_IDX = DY_IDX 
WHERE DY_H_ID IS NULL 
AND DY_IDX IS NOT NULL 
AND DATEPART(YYYY, DY_Date) = SUBSTRING(cte.[Date], 1, 4) 
AND DATEPART(MM, DY_Date) = SUBSTRING(cte.[Date], 6, 2) 
AND DATEPART(DD, DY_Date) = SUBSTRING(cte.[Date], 9, 2) 

Пожалуйста, не стесняйтесь смотреть и комментировать это.

1

Не могли бы вы не использовать DATEPART решить эту http://msdn.microsoft.com/en-us/library/ms174420.aspx

UPDATE Dairy 
SET DY_H_ID = (
      SELECT MAX(ID) 
      FROM History 
      WHERE H_DateTime <= DY_Date 
      AND H_IDX = DY_IDX 
      AND H_HA_ID = 7 
      AND H_HSA_ID = 19 
      AND H_Description LIKE 'Diary item added for :%' 
     ) 
WHERE DY_H_ID IS NULL 
AND DY_IDX IS NOT NULL 
AND DY_Date = (SELECT MAX(DY_Date) FROM Dairy) 

AND DATEPART(yyyy, DY_Date) = DATEPART(yyyy, H_DateTime) 
AND DATEPART(mm, DY_Date) = DATEPART(mm, H_DateTime) 
AND DATEPART(dd, DY_Date) = DATEPART(dd, H_DateTime) 
+0

Я вижу, как это может работать @Secret Squirrel. Тем не менее, я все еще пытаюсь заставить его работать, поскольку он обновляет только первые две записи до 3205 и 3206. Остальные 4 записи не обновляются. – frans

1

Я не был в состоянии понять, что именно вы хотите :-(, но этот запрос должен направить вас в правильном направлении:

UPDATE D 
SET D.DY_H_ID = H.ID 
FROM DAIRY D 
     INNER JOIN HISTORY H 
       ON Cast(D.DY_DATE AS VARCHAR(11)) = Cast( 
        H.H_DATETIME AS VARCHAR(11)) 
WHERE DY_H_ID IS NULL 
     AND DY_IDX IS NOT NULL 

Этот UPDATE запрос использует JOIN для сравнения дат между двумя таблицами. Я думаю, что это то, что вы просили, не так ли?

+0

Почти @Gidil. Из моих таблиц я хочу совместить идентификаторы в двух таблицах на основе даты. Таким образом, ID 10029 в Dairy должен иметь ID 3205 в DY_H_ID столбце внешнего ключа для обновления. ID 10030 - 3206 и т. Д. Но в таблице «История» есть несколько записей с H_MID G000001, G000002 и т. Д. Итак, я хочу выбрать MAX (ID) и сопоставить даты из двух таблиц. Я продолжу это выяснять. Спасибо за запрос выше. Я буду держать вас в курсе. – frans

+0

@frans, я думаю, я понимаю. Вы хотите выполнить как сравнение MaxID, так и сравнение даты и обновления соответственно? – Gidil

+0

Правильный @Gidil. Я хочу совместить оба. – frans

Смежные вопросы