我不斷收到以下 SQL 陳述句的運行時錯誤:
UPDATE tbl_1
INNER JOIN tbl_2 ON tbl_1.PersNo = tbl_2.PersNo
SET tbl_1.Marked = 'N/A'
WHERE NOT EXISTS (SELECT * FROM tbl_2 WHERE tbl_1.PersNo = tbl_2.PersNo)
我想我可能有一些語法倒退,當表 2 中不存在 PersNo 時,我希望用“N/A”(字串值)更新表 1 標記欄位。
這一切都源于一個帶有多個 SQL 陳述句的函式,它允許我用“是”、“否”或“不適用”來更新表 1 標記欄位。因此,如果有更簡單的方法可以做到這一點,我愿意接受建議。
簡而言之,如果表 2 中存在 PersNo 并且型別(來自表 2)是“摘要”,則使用“是”更新表 1 標記欄位,但是型別(來自表 2)是“完整”然后更新表 1用“No”標記的欄位,并且是表2中不存在的PersNo,用“N/A”更新表1標記的欄位。
uj5u.com熱心網友回復:
部分問題是 SQL Server 喜歡您在使用 a和 anFROM時使用表別名和子句,而 the出現在表之前:JOINUPDATESET
UPDATE t1
SET t1.Marked = 'N/A'
FROM tbl_1 t1
INNER JOIN tbl_2 t2 ON t1.PersNo = t2.PersNo
WHERE NOT EXISTS (SELECT * FROM tbl_2 WHERE t1.PersNo = tbl_2.PersNo)
這并不完全是 JOIN 更新的 ansi 標準,但我喜歡它,因為它可以很容易地先撰寫 SELECT 查詢,然后快速將其轉換為 UPDATE。
但是現在我們已經走到了這一步,邏輯似乎是錯誤的。如果NOT EXISTS()成功,JOIN條件將不匹配任何行,所以什么都不會改變。對于這一部分,您需要更多地考慮您正在嘗試做什么。根據書面描述,我認為你想要這個:
UPDATE t1
SET t1.Marked = CASE WHEN t2.Type='Summary' THEN 'Yes'
WHEN t2.Type='Full' THEN 'No'
ELSE 'N/A' END
FROM tbl_1 t1
LEFT JOIN tbl_2 t2 ON t1.PersNo = t2.PersNo
AND t2.Type IN ('Summary', 'Full')
這一切都源于一個帶有幾個 SQL 陳述句的 [procecdure],這些陳述句允許我用“是”、“否”或“不適用”來更新表 1 標記欄位。因此,如果有更簡單的方法可以做到這一點,我愿意接受建議。
我敢打賭,可以將所有或大部分這些步驟合并到一個查詢中,該查詢將在一小部分時間內執行相同的作業,但為了幫助解決這個問題,我們必須查看整個程序。
uj5u.com熱心網友回復:
對于 SQL Server,您的語法確實不正確 -如果我理解您的最后一段,您只需要一個條件case 運算式。如果以下(當然未經測驗)不正確,希望它足以讓您走上正軌:
update t1 set t1.Marked =
case t2.type
when 'Summary' then 'Yes'
when 'Full' then 'No'
else 'N/A'
end
from tbl_1 t1
left join tbl_2 t2 on t1.PersNo = t2.PersNo;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/452427.html
下一篇:按多個條件排序競爭對手
