Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-当我要连接的表的行数比我要更新的表的行数多得多时,使用基于内部连接的大小写更新列_Sql_Sql Server_Sql Update_Case_Inner Join - Fatal编程技术网

SQL Server-当我要连接的表的行数比我要更新的表的行数多得多时,使用基于内部连接的大小写更新列

SQL Server-当我要连接的表的行数比我要更新的表的行数多得多时,使用基于内部连接的大小写更新列,sql,sql-server,sql-update,case,inner-join,Sql,Sql Server,Sql Update,Case,Inner Join,我正在研究一种方法,根据订单发票标题的状态更新系统中订单的状态。目前,下面的查询会执行此操作,但是它会在每个发票头执行多次。订单上的所有发票标题都将具有相同的状态,因此我正在寻找一种方法,将其限制为仅检查一个发票标题 UPDATE [MyServer].[MyDatabase].[dbo].[Orders] SET Status = ( CASE WHEN ih.InvoiceStatus = 'ReadyToPrint'

我正在研究一种方法,根据订单发票标题的状态更新系统中订单的状态。目前,下面的查询会执行此操作,但是它会在每个发票头执行多次。订单上的所有发票标题都将具有相同的状态,因此我正在寻找一种方法,将其限制为仅检查一个发票标题

UPDATE [MyServer].[MyDatabase].[dbo].[Orders]
SET Status = (
        CASE 
            WHEN ih.InvoiceStatus = 'ReadyToPrint'
                THEN 4
            WHEN ih.InvoiceStatus = 'Transferred'
                THEN 5
            END
        )
FROM [MyServer].[MyDatabase].[dbo].[Orders] ord
INNER JOIN Database2.dbo.invoiceheader ih
    ON ih.OrderHeaderNumber= ord.OrderNumber
WHERE ord.Status = 2
示例数据:当前,如果我对状态进行选择,而不是设置,则会为每个发票标题输出4或5。我想找到一种方法,将此限制为每个订单一个

发票头与订单的关系基于发票头的OrderHeaderNumber和订单的OrderNumber,这是我为内部联接匹配的

示例发票标题行:下面是假设订单的两个示例发票标题

OrderHeaderNumber - InvoiceNumber - HeaderCharge - InvoiceStatus
12345             - 129           - 200          - ReadyToPrint
12345             - 128           - 350          - ReadyToPrint

可以使用多种样式来获取单个值。我更喜欢这种方法,因为您可以选择并获得将要更新的内容的确切列表

UPDATE ord SET Status = ih.InvoiceStatus
--SELECT *
FROM [MyServer].[MyDatabase].[dbo].[Orders] ord
INNER JOIN (
    SELECT DISTINCT
        OrderHeaderNumber
        ,CASE 
            WHEN ih.InvoiceStatus = 'ReadyToPrint'
                THEN 4
            WHEN ih.InvoiceStatus = 'Transferred'
                THEN 5
         END AS InvoiceStatus
    FROM Database2.dbo.invoiceheader
) ih ON ih.OrderHeaderNumber= ord.OrderNumber
WHERE ord.Status = 2

示例数据和所需结果会有所帮助。您不能将WHERE子句中的发票标题限制为您感兴趣的标题吗?@GordonLinoff添加了一些额外的信息,如果您需要更多信息,请告诉我。@JamesCooke我想我只是不确定如何将其限制为每个订单只查看一个?不幸的是,SQL不是我的强项,因此我可能会遗漏一些对经验丰富的人来说显而易见的东西。@CthuluHoop如果订单包含两个发票标题,一个是“准备打印”,一个是“已传输”,那么订单记录应该显示哪种状态?