視圖的資料需要把查詢的結果集,根據條件更新某些行列的值后,最后回傳更新的結果值。
有什么方法可以在視圖中實作上面邏輯
uj5u.com熱心網友回復:
這樣就失去了視圖的意義,視圖作用一般情況下,如果某些資料讀取過一次,第二次就會從快取里讀,速度相對來說會快一點,但是如果你要在視圖里定義資料,那么不光失去了視圖的原本意義,而且效率還不高,與其這樣不如寫函式或者存盤程序來執行比較好uj5u.com熱心網友回復:
create view [視圖名]
as
with t as
(
[原查詢陳述句]
)
select [欄位串列] --> 根據條件更新某些行列的值
from t --> 查詢的結果集
uj5u.com熱心網友回復:
舉個例子吧,比如我之前的查詢是這樣操作的。新增先把結果放到視圖,怎么處理
SELECT 1 AS ColA,'001' AS ColB
INTO #t
FROM dbo.aaa
UPDATE #t SET ColA=100 WHERE ColB='001'
SELECT * FROM #t
DROP TABLE #t
uj5u.com熱心網友回復:
create view view_aaa
as
select case when colB='001' then 100 else colA as colA
,colB
from dbo.aaa
go
uj5u.com熱心網友回復:
我只是舉例說明使用臨時表,實際是這樣的
SET @LOWVALUE = @LOWVALUE + '%'
SELECT a.FMOBILLNO AS 工單編碼/*工單編碼*/ ,
a.FMOENTRYSEQ AS ERP_MO_SEQ ,
w.FNUMBER AS 成品編碼 ,
a.FQTY AS 計劃數量 /*計劃數量*/ ,
ROW_NUMBER() OVER ( PARTITION BY FREPLACEGROUP, a.FBILLNO ORDER BY FREPLACEGROUP, a.FBILLNO, aa.FENTRYID ) AS 是否主料 ,
w1.FNUMBER AS 物料編碼 ,
FNUMERATOR / FDENOMINATOR AS 用量 /*用量*/ ,
CASE WHEN FISSUETYPE = 7 THEN 0
ELSE /*a2.FNOPICKEDQTY*/ aa.FSTDQTY
END AS 凈需求數量 ,
CASE WHEN FISSUETYPE = 7 THEN 0
ELSE /*a2.FNOPICKEDQTY*/ aa.FMUSTQTY
END AS 實際需求數量 ,
aa.FREPLACEGROUP/*項次*/ ,
aa.FSEQ /*行號*/ ,
aa.FENTRYID AS SEQ_ENTRY_CODE ,
a.FID ,
a.FMOID ,
a.FMOENTRYID ,
a1.FPOSITIONNO
INTO #b
FROM T_PRD_PPBOM a
INNER JOIN T_PRD_PPBOMENTRY aa ON a.FID = aa.FID
LEFT JOIN T_PRD_PPBOMENTRY_C a1 ON a1.FENTRYID = aa.FENTRYID
LEFT JOIN T_PRD_PPBOMENTRY_Q a2 ON a2.FENTRYID = aa.FENTRYID
LEFT JOIN T_BD_MATERIAL w ON w.FMATERIALID = a.FMATERIALID
LEFT JOIN T_BD_MATERIAL w1 ON w1.FMATERIALID = aa.FMATERIALID
WHERE 1 = 1
AND a.FMOBILLNO LIKE @LOWVALUE
AND a.FMOENTRYSEQ = @SEQ
SELECT 工單編碼 AS ERP_MO ,
成品編碼 AS PROD_ID ,
計劃數量 AS P_QTY ,
CASE WHEN 是否主料 != 1 THEN 物料編碼
ELSE 物料編碼
END AS MTRL_ID ,
CASE WHEN 是否主料 = 1 THEN 'Y'
ELSE 'N'
END AS IS_MAIN ,
CASE WHEN 是否主料 = 1 THEN 物料編碼
END AS MAIN_ID ,
用量 AS DOSAGE ,
凈需求數量 AS NN_QTY ,
實際需求數量 AS TN_QTY ,
FREPLACEGROUP/*項次*/ ,
FSEQ AS SEQ /*行號*/ ,
FPOSITIONNO AS POINT_STR ,
ERP_MO_SEQ /*生產訂單行號*/ ,
SEQ_ENTRY_CODE
INTO #bb
FROM #b
WHERE 1 = 1
AND ( ( SELECT FSTATUS
FROM T_PRD_MO g
INNER JOIN T_PRD_MOENTRY gg ON g.FID = gg.FID
INNER JOIN T_PRD_MOENTRY_A gg_A ON gg_A.FENTRYID = gg.FENTRYID
WHERE g.FID = FMOID
AND gg.FENTRYID = FMOENTRYID
) = 3
OR ( SELECT FSTATUS
FROM T_PRD_MO g
INNER JOIN T_PRD_MOENTRY gg ON g.FID = gg.FID
INNER JOIN T_PRD_MOENTRY_A gg_A ON gg_A.FENTRYID = gg.FENTRYID
WHERE g.FID = FMOID
AND gg.FENTRYID = FMOENTRYID
) = 4
)
AND 工單編碼 LIKE @LOWVALUE
AND ERP_MO_SEQ = @SEQ
SELECT *
INTO #bb1
FROM #bb
WHERE #bb.IS_MAIN = 'Y'
UPDATE #bb
SET #bb.MAIN_ID = a.MTRL_ID
FROM #bb1 a
WHERE #bb.IS_MAIN = 'N'
AND #bb.FREPLACEGROUP = a.FREPLACEGROUP
AND #bb.ERP_MO = a.ERP_MO
AND #bb.ERP_MO_SEQ = a.ERP_MO_SEQ
SELECT *
FROM #bb
WHERE 1 = 1 --AND NN_QTY>0
AND ERP_MO LIKE @LOWVALUE
AND ERP_MO_SEQ = @SEQ
DROP TABLE #b
DROP TABLE #bb
DROP TABLE #bb1
uj5u.com熱心網友回復:
你這個比較復雜, 最好的方式是做成報表, 存盤程序處理完成之后,存放在結果表里,用戶直接查看結果表就可以了。如果你的資料量不大,可在用 多陳述句表值函式 來代替。
但這個的效率不高。
uj5u.com熱心網友回復:
之前就是用存盤程序的,但是現在系統遷移到云端,無法直接訪問資料庫,只能做視圖單據(底層是視圖)查詢。所以必須轉換為視圖。
uj5u.com熱心網友回復:
之前就是用存盤程序的,但是現在系統遷移到云端,無法直接訪問資料庫,只能做視圖單據(底層是視圖)查詢。
所以必須轉換為視圖。
uj5u.com熱心網友回復:
沒聽說過云端就不能用存盤程序。
uj5u.com熱心網友回復:
云端也可以用存盤程序轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/256118.html
標籤:基礎類
