簡體   English   中英

使用視圖或表中的列插入/更新空值列

[英]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)列在實際表中不存在,我僅將其用於一個簡單而骯臟的示例。 除了顯而易見的問題如何將所需的值更新/插入到列中之外,我還覺得我在何時以及如何使用UPDATEINSERTWHERE概念上存在缺陷。 任何幫助都會很棒。 謝謝。

更新

我已經更新了我的示例,以消除對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM