簡體   English   中英

根據IF Else條件更新列

[英]Update column based on IF Else Condition

我有兩個表A和B

表A

ID_number as PK
first_name, 
L_Name

表B

ID_number, 
Email_id,
Flag

我有幾個人具有多個電子郵件ID,並且已經在表B上標記為X。

而我正在嘗試查找具有電子郵件ID或多個電子郵件ID但從未被標記的人員列表。

例如, John clark在表B中可能有2封電子郵件,但從未被標記。

簡單使用not exists

select a.*
from a
where not exists (select 1 
                  from b
                  where b.id_number = a.id_number and b.flag = 'X'
                 );

您可能要執行更新,但是您的問題似乎僅與選擇有關(可能基於選擇進行更新)。 應該是這樣的:

SELECT A.L_Name
FROM A 
WHERE NOT EXISTS (
    SELECT 1 
    FROM B 
    WHERE B.ID_number = A.ID_number AND B.Flag = 'X'
)

OR LEFT JOIN版本

SELECT 1
FROM A 
    LEFT JOIN B ON B.ID_number = A.ID_number AND B.Flag = 'X'
WHER B.ID_number IS NULL

通常,第一個版本比第二個版本快。

忘記表A ...

SELECT DISTINCT ID_number FROM table_b t1 
WHERE NOT EXISTS(
SELECT NULL FROM table_b t2 WHERE t1.ID_number=t2.ID_number AND t2.flag='X'
)

從您在評論中的回答來看,我認為這是您想要的:

--drop table update_test;

create table update_test
(
    id_num      number,
    email_id    number,
    flag        varchar2(1) default null
);

insert into update_test values (1, 1, null);
insert into update_test values (1, 2, null);
insert into update_test values (2, 3, null);
insert into update_test values (2, 7, null);
insert into update_test values (3, 2, null);
insert into update_test values (3, 3, 'X');
insert into update_test values (3, 7, null);

select * from update_test;

select id_num, min(email_id)
from update_test
group by id_num;

update update_test ut1
set flag = case 
    when email_id = (
        select min(email_id) 
        from update_test ut2 
        where ut2.id_num = ut1.id_num
    ) then 'X' 
    else null end
where id_num not in (
    select id_num 
    from update_test
    where Flag is not null);

最后更新語句將更新,並設置Flag為每個記錄字段id_num與最低組email_id 如果id_num組已經將Flag字段設置為1,它將忽略它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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