1

私はここで少し立ち往生しています。条件に基づいて返されたビューを変更しようとしています。私はSQLにかなり慣れていて、返された結果に少し苦労しています。私が書いたビューの部分的なコンポーネントを次に示します。

WITH A AS (

SELECT
  ROW_NUMBER() OVER (PARTITION BY fkidContract,fkidTemplateItem ORDER BY bStdActive DESC, dtdateplanned ASC) AS RANK,
  tblWorkItems.fkidContract AS ContractNo,
  ....
FROM tblWorkItems
WHERE   fkidTemplateItem IN
                    (2895,2905,2915,2907,2908,
                     2909,3047,2930,2923,2969,
                     2968,2919,2935,2936,2927,
                     2970,2979)
AND ...
)
SELECT * FROM A WHERE RANK = 1

返される結果は次のようになります。

ContractNo| ItemNumber |    Planned   |  Complete
  001     |    100     |  01/01/1900  | 02/01/1900
  001     |    101     |  03/04/1900  | 02/01/1901
  001     |    102     |  03/06/1901  | 02/08/1900
  002     |    100     |  01/03/1911  | 02/08/1913

これにより、期待どおりの結果が得られますが、悪夢のような結晶レポートのため、このビューを少し変更する必要があります。この返された結果セットを取得し、同じテーブルと同じ Contract リレーションシップから取得した値を使用して既存の列を変更したいと考えています。たとえば、次のようになります。

UPDATE A
SET A.Completed = ( SELECT  R.Completed
                        FROM myTable R
                            INNER JOIN A
                                ON A.ContractNo = R.ContractNo
WHERE A.ItemNumber = 100 AND R.ItemNumber = 101
                        )

私がやろうとしているのは、あるタスクの「完了日」を変更し、両方が同じ ContractNo フ​​ィールド値を共有している場合、別のタスクの完了日にすることです。

4

2 に答える 2

0

A と R の間の ItemNumber の関係についてはよくわかりませんが (おそらくテストのためだけだったのかもしれません...)、実際には何も UPDATE したくないようですが、状況によっては別の値を使用したいようです。 . したがって、クエリの非 cte 部分を次のように変更したいだけかもしれません。

SELECT A.ContractNo, A.ItemNumber, A.Planned, 
       COALESCE(R.Completed,A.Completed) as Completed
FROM A
LEFT OUTER JOIN myTable R
ON A.ContractNo = R.ContractNo
AND A.ItemNumber = 100 AND R.ItemNumber = 101  -- I'm not sure about this part
WHERE A.Rank = 1
于 2013-10-07T06:00:16.790 に答える