为列分配最大值+ 1

时间:2016-05-19 21:59:51

标签: sql-server

我需要像这样的伪代码;

UPDATE  Orders
SET     InvoiceNo = MAX(InvoiceNo)
FROM    Orders INNER JOIN SetupAccountTypes ON Orders.AccountTypeID = SetupAccountTypes.ID
WHERE  (SetupAccountTypes.AccountType = N'COD') AND (Orders.DeliveryDate >= CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) AND (Orders.DeliveryDate <= CONVERT(DATETIME, '2016-01-31 00:00:00', 102))   

也就是说,在给定的WHERE条件下选择的一堆行会逐渐分配发票号。

如何在T-SQL或其他方面实现这一目标?

由于

此致

3 个答案:

答案 0 :(得分:0)

从问题中有点不清楚,但看起来您正在尝试根据另一个表中的数据更新表。一个很好的SQL Server工具是MERGE语句。 SQL MERGE

它允许您根据与源表的连接结果在目标表上执行插入更新和删除。 (全部在一个声明中)

答案 1 :(得分:0)

听起来有些订单有发票而有些订单没有,因为您在日期过滤订单表。这表明一个稍微不同的解决方案:也许您可以通过表结构调整而不是复杂的查询更轻松地解决您的问题。不要将发票号码放在订单表中,而是为发票创建一个表格。如果您在该表中使用InvoiceNo作为主键,它将自动为您增加InvoiceNo - 无需手动查询。

class createComment: UIView, UITextFieldDelegate {

    @IBOutlet weak var commentTextField: StyleComentTextField!
    weak var controller:tableComentVC!
    var currentController = tableComentVC()

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func awakeFromNib() {
        self.commentTextField.delegate = self
    }

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        commentTextField.resignFirstResponder()
        if(textField == commentTextField){
             print("ok i tab in commentTextField")
            let storyBoard: UIStoryboard = UIStoryboard (name: "Main", bundle: nil)
            self.controller?.navigationController!.pushViewController(storyBoard.instantiateViewControllerWithIdentifier("writeComment") as! writeComment, animated: true)
            resign()
            return false
        }else{
            return true
        }
    }

}

此表使用Orders表中的主键(可能您将其命名为OrderNo,可能还有其他内容)将发票与订单绑定。

您可以使用insert into select来填充此表:

CREATE TABLE Invoices 
(InvoiceNo bigint PRIMARY KEY CLUSTERED,
 OrderId bigint REFERENCES ORDERS.OrderNo
);

答案 2 :(得分:0)

这就是你要找的东西:

declare @counter = (SELECT MAX(InvoiceNo) FROM Orders)

UPDATE  Orders
SET     InvoiceNo = @counter, @counter = @counter + 1
FROM    Orders 
INNER JOIN SetupAccountTypes 
    ON Orders.AccountTypeID = SetupAccountTypes.ID
WHERE  (SetupAccountTypes.AccountType = N'COD') 
    AND (Orders.DeliveryDate >= CONVERT(DATETIME, '2016-01-01 00:00:00', 102)) 
    AND (Orders.DeliveryDate <= CONVERT(DATETIME, '2016-01-31 00:00:00', 102))