2012-06-21 53 views
0

我正在寫一個sql語句(見下文),它比較了兩個不同的表table1和table2上的兩個序列號。如果序列號存在,那麼我希望table1上的另一列更新爲'是',如果table1中的序列號不存在於table2中,我想用'no'更新。加入2個表,比較列和更新第3列

我當前的sql語句有效完美無缺,並在必要時填寫'是'。我的問題是,當序列號不存在時,不要放置'否',而是更新爲NULL。我的where語句很重要,因爲我只想比較兩個表中日期和安裝匹配的表上的序列號。我不想比較每一行。感謝

UPDATE dbo.table1 
    SET [Match] = CASE WHEN dbo.table2.[Serial Number] IS NOT NULL 
    THEN 'yes' ELSE 'no' END 
     FROM dbo.table1 LEFT OUTER JOIN dbo.table2 
      ON dbo.table2.[Serial Number] = dbo.table1.[Serial Number] 
     Where dbo.table1.[Date] = 'JAN11' AND 
       dbo.table1.[Install] = 'new' AND 
       dbo.table2.[Date] = 'JAN11' AND 
       dbo.table2.[Install] = 'new' 

回答

2

把WHERE條件JOIN的條件:

UPDATE dbo.table1 
SET [Match] = CASE WHEN dbo.table2.[Serial Number] IS NOT NULL 
THEN 'yes' ELSE 'no' END 
    FROM dbo.table1 LEFT OUTER JOIN dbo.table2 
     ON dbo.table2.[Serial Number] = dbo.table1.[Serial Number] 
    AND dbo.table1.[Date] = 'JAN11' AND 
      dbo.table1.[Install] = 'new' AND 
      dbo.table2.[Date] = 'JAN11' AND 
      dbo.table2.[Install] = 'new' 

@ Baz1nga:

的WHERE導致要過濾掉的行,價值因此設置(一個或多個)沒有被分配回table1。

試試這個:

create table tblA 
(
x int, y varchar(10) 
); 


create table tblB 
(
x int, some_date varchar(10), serial_number int 
); 


insert into tblA(x,y) values(1,'www'); 
insert into tblB(x,some_date,serial_number) values(1,'yyy',76); 

print 'First update'; 
update tblA 
set y = case when tblB.serial_number is not null then 'Yes' else 'No' end 
from tblA 
left join tblB on tblB.x = tblA.x 
where tblB.some_date = 'JAN11'; 

select * from tblA; 

print 'Second update'; 
update tblA 
set y = case when tblB.serial_number is not null then 'Yes' else 'No' end 
from tblA 
left join tblB on tblB.x = tblA.x 
and tblB.some_date = 'JAN11'; 

select * from tblA; 

輸出:

(1 row(s) affected) 

(1 row(s) affected) 
First update 

(0 row(s) affected) 
x   y 
----------- ---------- 
1   www 

(1 row(s) affected) 

Second update 

(1 row(s) affected) 
x   y 
----------- ---------- 
1   No 

(1 row(s) affected) 
+0

@ Baz1nga我把解釋的答案,查看更新的答案 –

+0

非常感謝,並感謝您的解釋也是如此。我發現有時很難調試sql語句,所以這有很大幫助。 – kev670