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

这给了我预期的结果,但由于噩梦般的水晶报告,我需要稍微改变这个观点。我想获取这个返回的结果集并使用从同一个表和相同的合同关系中提取的值修改现有列,如下所示:

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 关系(也许它只是为了测试......),但似乎你真的不想更新任何东西,但你想在某些情况下使用不同的值. 因此,也许您只想将查询的非 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 回答
0

所以事实证明,实际阅读供应商文档会有所帮助:)

SELECT 
  column1,
  column2 = 
    case
      when date > 1999 then 'some value'
      when date < 1999 then 'other value'
      else 'back to the future'
    end

FROM ....

作为参考,总查询执行了超过约 500 万条记录的三重内连接,这个案例语句的性能令人惊讶。

我建议将其作为副本关闭。

于 2013-10-26T01:28:05.430 回答