[英]Insert/Update a Column of Null Values with a Column From a View or Table
我在更新上一個INSERT
之后包含NULLS
的表中的列時遇到困難。 舉例說明我的困境的最簡單方法是:
CREATE TABLE TEST(p_ID INT, T varchar(50))
INSERT INTO TEST(p_ID)
SELECT *
FROM vw_MyView -- Contains a column of ints, but I will use strings here
預期的輸出
SELECT * FROM TEST
p_ID T
6 NULL
7 NULL
8 NULL
9 NULL
10 NULL
11 NULL
12 NULL
13 NULL
14 NULL
我第一次添加數據的嘗試是將視圖中的值插入(T)
INSERT INTO TEST(T)
SELECT *
FROM vw_MyView
WHERE T IS NULL -- Wrong! "Invalid column name 'T'."
但是,當然,WHERE子句與視圖兼容...謝謝,谷歌。
我的第二次嘗試是使用UPDATE
BEGIN TRAN
UPDATE TEST
SET TEST.T = T.ID
FROM
(
SELECT *
FROM vw_MyView
) T
WHERE TEST.T IS NULL -- Why is this allowed here?
SELECT * FROM TEST
ROLLBACK TRAN
這也失敗了,因為它僅使用視圖的第一行來更新列
p_ID T
6 a
7 a
8 a
9 a
10 a
11 a
12 a
13 a
14 a
所需的輸出是
p_ID T
6 a
7 b
8 c
9 d
10 e
11 f
12 g
13 h
14 i
請注意,(p_ID)列在實際表中不存在,我僅將其用於一個簡單而骯臟的示例。 除了顯而易見的問題如何將所需的值更新/插入到列中之外,我還覺得我在何時以及如何使用UPDATE
或INSERT
和WHERE
概念上存在缺陷。 任何幫助都會很棒。 謝謝。
更新
我已經更新了我的示例,以消除對p_ID
列的某些混淆,它在表中不存在,希望如此... 我的主要目標是從視圖中獲取值以更新其中的NULL
值。列(T) 。 謝謝。
我想你在找
INSERT INTO Test(p_ID, T)
SELECT IntCol, IntCol
FROM vw_MyView;
然后根據所需的輸出,如果要UPDATE
表,則
UPDATE Test
SET T = p_Id;
這回答了問題的原始版本。
您似乎想要這樣的東西:
INSERT INTO TEST (p_id, T)
SELECT v.?, v.? -- ? is the column name for the view
FROM vw_MyView v;
或者,如果表中已經有數據,則根本不需要該視圖:
UPDATE t
SET t.T = t.ID
FROM TEST t
WHERE t.T IS NULL ;
使用vw_MyView
數據更新test
update t
set T = v.charCol
from test t
join vw_MyView v on t.p_ID = v.IntCol;
錯誤是使用*。 嘗試始終准確列出所需的字段。 也就是說,在您的情況下,您需要按以下方式重寫它:
CREATE TABLE TEST (p_ID INT, T varchar (50));
INSERT INTO TEST (p_ID)
SELECT p_ID
FROM vw_MyView;
同樣,在定義視圖時,避免使用*,始終顯式列出必填字段Update:
START TRANS
UPDATE t
SET t.T=mv.ID
FROM TEST as t
INNER JOIN vw_MyView as mv on t.Key=mv.Key
and t.T IS NULL;
ROLLBACK TRAN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.