MS T-SQL UPDATE语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MS T-SQL UPDATE语句相关的知识,希望对你有一定的参考价值。

提前感谢您的反馈。

我正在尝试从连接中的条件更新列。

我可以使用SELECT返回我想要的列,但是UPDATE语句什么都不做。

我试过这两种方式(见下文)。示例二嵌套了SELECT语句,该语句独立工作,返回12行,但是当我尝试更新列时,我返回0行或返回2行。并且这两行不是SELECT语句中的行。如果需要的话,我会在后来追逐那只兔子,但我想请一些反馈。

查询#1:

BEGIN TRAN

UPDATE lot_group        
SET lot_group_code = 'Finished'
FROM inv_mast_lot i
LEFT JOIN lot_group l ON i.lot_group_uid = l.lot_group_uid
LEFT JOIN line o  ON i.inv_mast_uid = o.inv_mast_uid
LEFT JOIN header h ON o.order_no = h.order_no
LEFT JOIN inventory m ON i.inv_mast_uid = m.inv_mast_uid
WHERE 
    l.lot_group IS NULL
    AND o.cancel_flag <> 'Y'
    AND o.company_no = 'db1'
    AND o.complete <> 'Y'
    AND o.delete_flag <> 'Y'
    AND h.projected_order <> 'Y'
    AND m.item_id = 'part_1')

ROLLBACK/COMMIT

查询#2:

BEGIN TRAN      

UPDATE lot_group 
SET lot_group_code = 'Finished'
WHERE EXISTS (SELECT l.lot_group_code, m.item_id, l.lot_group_uid   
              FROM inv_mast_lot i
              LEFT JOIN lot_group l ON i.lot_group_uid = l.lot_group_uid
              LEFT JOIN line o ON i.inv_mast_uid = o.inv_mast_uid
              LEFT JOIN header h ON o.order_no = h.order_no
              LEFT JOIN inventory m ON i.inv_mast_uid = m.inv_mast_uid
              WHERE l.lot_group IS NULL
                AND o.cancel_flag <> 'Y'
                AND o.company_no = 'db1'
                AND o.complete <> 'Y'
                AND o.delete_flag <> 'Y'
                AND h.projected_order <> 'Y'
                AND m.item_id = 'part_1') 

ROLLBACK/COMMIT 
答案

首先,我将更改update语句以使用在查询的其余部分中使用的别名。接下来查看查询是否返回任何有用的内容,您可以嵌入注释掉的选择。这样,您可以只运行选择,直到您确定要获取要更新的数据,确保更新然后正确运行。另一种技术是运行select,运行更新,然后每次运行select回滚,直到得到正确的结果。我更喜欢做第一个,直到我很确定我正在选择正确的记录进行更新。然后转到第二种方法,以确保更新发生在我想象的那样。

       UPDATE l    
            SET lot_group_code = 'Finished'
--select l.lot_group_code, *
            FROM inv_mast_lot i
            LEFT JOIN lot_group l
                ON i.lot_group_uid = l.lot_group_uid
            LEFT JOIN line o 
                ON i.inv_mast_uid = o.inv_mast_uid
            LEFT JOIN header h
                ON o.order_no = h.order_no
            LEFT JOIN inventory m 
                ON i.inv_mast_uid = m.inv_mast_uid
            WHERE l.lot_group IS NULL
                AND o.cancel_flag <> 'Y'
                AND o.company_no = 'db1'
                AND o.complete <> 'Y'
                AND o.delete_flag <> 'Y'
                AND h.projected_order <> 'Y'
                AND m.item_id = 'part_1')
另一答案

这只是搞砸了。

没有目的更新左连接的目标。 null表示没有任何内容可以更新。

你通过在其中放置一个条件来否定所有其他左连接。

以上是关于MS T-SQL UPDATE语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SELECT 或 UPDATE 语句中使用 T-SQL UDF?

数据库 t-sql 语句

SqlCommandBuilder类是如何构建T-Sql语句

T-SQL语句的分为哪四类?

将 MS Access 查询(使用 IIF() 和 DATESERIAL())事务处理到 T-SQL

在 JAVA 中使用带有 MS Access 2010 数据库的 Update 语句