0

この質問は、私の以前の質問に関連しています。

ID のみを最新の日付 SQL で更新する (2/6)

次の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 は 3206 の ID を取得する必要があり、ID 10031 は ID 3207 を取得する必要があり、ID 10032 は 3208 などを取得する必要があります。

両方のテーブルの値が変更されることに注意してください。

4

3 に答える 3

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、2 つのテーブルの日付を比較するために を使用します。これがあなたが求めていたものだと思いますよね?

于 2013-08-27T12:18:29.370 に答える
1

このhttp://msdn.microsoft.com/en-us/library/ms174420.aspxを解決するためにDATEPARTを使用できませんか

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

見つけた!!私を正しい方向に向けてくれた@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 に答える