2017-02-15 116 views
0

我寫了以下內容,它返回只有一個房間的建築物列表,但該房間的面積(fma0.area)不等於建築物的面積(fmb0 .nia)SQL Server - 基於SELECT的更新數據

select 
rtrim(fma0.bldgcode) As bldgcode 
from fma0 
left join fmb0 on fma0.bldgcode = fmb0.bldgcode 
where fma0.bldgcode in (
    select fma0.bldgcode 
    from fma0 
    left join fmb0 on fma0.bldgcode = fmb0.bldgcode 
    where fmb0.bldgstatus = '' 
    group by fma0.bldgcode 
    having count(fma0.auto_key) = 1 
) 
and round(fma0.area,0) <> fmb0.nia 
and fmb0.nia > 0 
order by 1 

我需要使用建築的這份名單,以更新FMA0表(FMA0.GROSS,FMA0.AREA,FMA0.RENTABLE)幾個字段從FMB0.NIA的價值每BLDGCODE相同的BLDGCODE

如何將其轉換爲UPDATE語句,該語句爲每個BLDGCODE查找FMB0.NIA值並更新FMA0 ta中相同BLDGCODE的每個字段中的值竹葉提取

感謝

+1

樣本數據和預期的結果將真正幫助他人理解數據。 –

回答

1

在大多數情況下,SQL更新使用一個特定的表(UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1)直接引用來執行的。然而,有時候,通過使用從輔助查詢語句獲得的數據的子集間接地改變表的內容可能是有益的。

使用輔助SELECT語句執行UPDATE可以通過兩種方式之一來完成,主要取決於您使用的是哪個版本的SQL Server。我們將簡要探討兩種選擇,以便您可以找到最適合您的選項。

使用內部聯接

對於所有SQL Server安裝,執行此操作的最基本的方法是使用一個INNER JOIN,由此在兩個不同的表的列值進行相互比較。

UPDATE 
    books 
SET 
    books.primary_author = authors.name 
FROM 
    books 
INNER JOIN 
    authors 
ON 
    books.author_id = authors.id 
WHERE 
    books.title = 'The Hobbit' 

在上面的例子中,我們正在更新books.primary_author場通過在查詢到其各接合兩個表,匹配authors.id的值,以關於「霍比特」的authors.name匹配,並且books.author_id。

使用合併更新並同時

插入用於SQL Server 2008和更新,微軟推出了非常有用的合併操作類似於上述INNER JOIN方法,而是融爲一體,嘗試同時執行的UPDATE和INSERT一起命令。這可以根據執行的查詢有效地同步兩個表,根據需要更新和插入記錄以供兩者匹配。

MERGE INTO 
    books 
USING 
    authors 
ON 
    books.author_id = authors.id 
WHEN MATCHED THEN 
    UPDATE SET 
    books.primary_author = authors.name 
WHEN NOT MATCHED THEN 
    INSERT 
    (books.author_id, books.primary_author) 
    VALUES 
    (authors.id, authors.name) 

使用合併時,肯定是更復雜的則是一個基層黨內有點JOIN,但是一旦你掌握瞭如何操作的功能,你很快就會明白如何強大這種能力可以真正完整的查詢。

前幾行是相當不言自明:

MERGE INTO 
    books 
USING 
    authors 
ON 
    books.author_id = authors.id 

我們希望通過二次authors表合併成(UPDATE/INSERT)的書表,我們兩個基於匹配相同的books.author_id = authors.id比較。

MERGE命令不同的地方在於後面的分支邏輯。

WHEN MATCHED THEN 
    UPDATE SET 
    books.primary_author = authors.name 

這裏我們要求SQL僅在記錄匹配時執行操作 - 找到現有記錄時。在這種情況下,我們執行一個標準的UPDATE,就像我們之前所做的那樣,將books.primary_author字段設置爲等於authors.name字段。

最後,如果查詢發現一個不存在的匹配比較記錄,我們改爲執行INSERT。

WHEN NOT MATCHED THEN 
    INSERT 
    (books.author_id, books.primary_author) 
    VALUES 
    (authors.id, authors.name) 

這裏我們只是要求SQL插入一個新的記錄到書表,並沿着價值傳遞的AUTHOR_ID和primary_author領域,從相關authors表記錄抓起。

我們MERGE聲明的最終結果是,對於作者表中的每個作者,我們驗證書中是否存在相應的書。如果找到記錄,我們確保books.primary_author使用UPDATE進行設置,如果找不到匹配項,我們會爲圖書添加新記錄。因此,您應該對通過使用輔助比較SELECT語句可用於更新SQL記錄的兩種不同方法有深入的瞭解。

+0

合併對於這個問題完全沒有必要。 –

1

這似乎是一個更簡單的方式來獲得你想要的建築:

select b.bldcode 
from fmbo b join 
    (select r.bldgcode, max(r.area) as room_area 
     from fma0 r 
     group by r.bldgcode 
     having count(*) = 1 
    ) r 
    on r.bldgcode = b.bldgcode and r.room_area <> b.nia; 

第一個子查詢得到房間的面積在只有一個房間的建築物。 join然後根據您的規則簡單地組合它們。

這很容易變成一個更新:

update b 
    set . . . 
    from fmbo b join 
     (select r.bldgcode, max(r.area) as room_area 
      from fma0 r 
      group by r.bldgcode 
      having count(*) = 1 
     ) r 
     on r.bldgcode = b.bldgcode and r.room_area <> b.nia; 
相關問題