2016-08-12 70 views
0

我想從其他來源更新我的文檔表中的記錄。在另一個表上只有一個實例的更新記錄

文件

Name   , Account Number, Date of birth 
S MHLONGO , 00000   ,16/12/1986 
O CHUMU  , 00000   ,12/12/1986 
V MBONANE , 00000   ,09/12/1986 

客戶

Name, Account Number, Date of birth 
    S MHLONGO , 33178   ,16/12/1986 
    S MHLONGO , 33682   ,16/12/1986 
    O CHUMU  , 32892   ,16/12/1986 
    V MBONANE , 52162   ,16/12/1986 

正如你所看到的,我沒有一個帳號在Documents鏈接,但我可以使用的是姓名和出生日期。但是,同一天可能會出現兩個或更多的S MHLONGO。所以我需要運行一個更新聲明,它將在client中搜索姓名和出生日期,如果它只有1個條目(並且只有1個條目在客戶端中)匹配DocumentsName and date of birth以更新那些記錄Documents

Example 

文件

Name  , Account Number, Date of birth 
    O CHUMU  , 32892   ,16/12/1986 
    V MBONANE , 52162   ,16/12/1986 

我知道它有點冒險,我只是想知道,如果是可以做到的,以及如何將腳本是什麼樣子?

我都DB的:-)

+0

在WHERE CLAUSE中使用子查詢,做WHERE ... AND(SELECT COUNT(*)FROM CLIENT C WHERE C.Name = D.Name AND C.DOB = D.DOB)= 1 - 檢查它給出正確的記錄首先在一個選擇,然後你可以將它添加到一個CTE,並且只需更新CTE,或者執行 - UPDATE ... WHERE - 這與EXISTS風格的子查詢類似,除非在這種情況下您的條件是1不是任何 – Cato

+0

嗨@Andrew Deighton,我不放棄明白你想讓我做什麼,你能詳細說明一下嗎? – user3309798

回答

1

的備份,這是該update子句中使用group byjoin的方法:

update d 
set account_number = c.account_number 
from documents d join 
    (select name, date_of_birth, count(*) as cnt, 
      min(account_number) as account_number 
     from client 
     group by name, date_of_birth 
     having count(*) = 1 
    ) c 
    on c.name = d.name and c.date_of_birth = d.date_of_birth; 

注意使用min(account_number)。這很好,因爲如果只有一個帳號,那麼min()(或max())將返回它。

+0

嗨@Gordon Linoff,謝謝你的迴應,但它不會執行,錯誤消息102,Level 15,State 1,Line 11 ';'附近語法不正確。 – user3309798

+0

請你可以看看上面的??? – user3309798

+0

@ user3309798。 。 。如果分號引起問題,請將其刪除。 SQL Server允許分號,但是如果您在代碼中調用,則可能存在問題。 –

相關問題