2017-02-15 55 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; 
相关问题