0

这个问题与我之前的问题有关:

仅使用最新日期 SQL 更新 ID(6 个中的 2 个)

我有以下 2 个表:

表 1 和表 2

我已经有这个查询更新了 Table1 中的 ID,其中只找到了最新的日期。但是,是否可以根据日期将 Table1 上的适当 ID 与 Table2 上的适当 ID 匹配。

请在下面查看我的查询:

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)

例如,表 1 中的 ID 10029 应该从历史记录中获取 ID 3205。ID 10030 应该得到 ID 3206,ID 10031 应该得到 ID 3207,ID 10032 应该得到 3208 等等。

请注意,两个表中的值都会发生变化。

4

3 回答 3

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)

请随时查看并对此发表评论。

于 2013-08-27T13:27:58.427 回答
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)
于 2013-08-27T11:28:27.237 回答
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查询使用 aJOIN来比较两个表之间的日期。我想这就是你所要求的,对吧?

于 2013-08-27T12:18:29.370 回答