如果条件满足,如何使用第2列更新第1列

时间:2017-03-18 13:55:08

标签: sql sql-server

我需要在SQL Server 2008数据库中实现某些功能。

我的问题是:我需要做的就是在一个表中发生,我必须使用我在同一列中但在其他条件下的值更新列。

我必须执行类似覆盖价格的操作,其中columnxcolumny具有某些特定值,其中columnxcolumny的价格具有其他一些值,让我来描述一下这在图像中,一切都会更好地解释:

enter image description here

正如您在图片人身上看到的,我需要更新doc_code 0和doc_number 1的价格,以及doc_code为0且doc_number为2的情况下的价格值。

我试过这个,但那不起作用:

UPDATE Products
SET Products.price = temp.price,
    Products.pricetwo = temp.pricetwo
FROM
    Products,
    (SELECT price, pricetwo
     FROM Products
     WHERE Products.doc_code = 0 AND Products.doc_number = 2) temp
WHERE 
    Products.doc_code = 0 AND Products.doc_number = 1

我认为上面的代码会这样做,好吧,给我价格,其中doc代码为0,doc编号为2,并将它们设置为doc code 0和doc number 1,但不幸的是,这对我没有帮助.. < / p>

我需要使用doc_code = 0和doc_number = 1更新所有价格,这意味着用doc_code = 0和doc_number = 2

的价格替换doc_code = 0和doc_number = 1的价格

谢谢你们 干杯

2 个答案:

答案 0 :(得分:0)

如果我正在读这个,那么:

update p1
set p1.price = p2.price
  , p1.pricetwo = p2.pricetwo
from Products p1
  inner join Products p2
    on p1.doc_code = p2.doc_code
   and p1.doc_number = 1 /* this could also be in the where instead */
   and p2.doc_number = 2 /* this could also be in the where instead */
where p1.doc_code = 0;

但如果您有{1}}

的行超过1行,则无法预测

答案 1 :(得分:0)

根据您的图片:

  1. 过滤器:有2行,其中doc_code = 0,doc_number = 1(要更新的两行)
  2. 只有1行,doc_code = 0,doc_number = 2。它的价格= 1,应该更新上述过滤器中的任何一行。
  3. 如果我在解密时出错,以下内容将无济于事。而且,我没有写出更新声明,我希望你看看它是如何工作的。

        CREATE TABLE #products(
            [ID] [int] NULL,
            [doc_code] [int] NULL,
            [doc_number] [int] NULL,
            [price] [money] NULL,
            [price_two] [money] NULL
        ) ON [PRIMARY];
        GO
        INSERT INTO #products
                   ([ID]
                   ,[doc_code]
                   ,[doc_number]
                   ,[price]
                   ,[price_two])
             VALUES
                   (1,0,2,1,1)
                   ,(2,0,1,5.6,4.6)
                   ,(3,0,1,7,3)
                   ,(4,1,1,2,2)
                   ,(5,1,2,2,2)
                   ,(6,1,2,3,3)
                   ,(7,2,3,4,2)
                   ,(8,2,0,10,5)
                   ,(9,0,0,3,3)
                   ,(10,1,0,5,2);
        GO
        --Select * FROM #products
        SELECT [ID]
            ,[doc_code]
            ,[doc_number]
            ,[price]
            ,[price_two]
            ,CAST([doc_code] as varchar)+''+CAST([doc_number] as varchar) conc
            ,(Select top 1 price_two FROM #products WHERE [doc_code]+''+[doc_number]= '02') new_price
        FROM #products
        WHERE CAST([doc_code] as varchar)+''+CAST([doc_number] as varchar)= '01'
    
        DROP Table #products