我有点卡在这里。我正在尝试根据条件修改返回的视图。我在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字段值,则将其作为另一个任务的完整日期。
答案 0 :(得分: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
答案 1 :(得分:0)
事实证明,实际阅读vendor documentation有助于:)
SELECT
column1,
column2 =
case
when date > 1999 then 'some value'
when date < 1999 then 'other value'
else 'back to the future'
end
FROM ....
作为参考,总查询在大约500万条记录中进行了三重内部联接,这个案例陈述令人惊讶地表现出来。
我建议将其作为duplicate关闭。