2010-10-05 44 views
25

Các truy vấn dưới đây đang làm việc:SQL cập nhật top1 hàng truy vấn

update top(1) ShipBillInfo 
set  shipfirstname='kkk' 
where CustomerId='134'; 

nhưng nó đang hiển thị lỗi nếu tôi cố gắng để đặt hàng bởi một số Id: ví dụ:

update top(1) ShipBillInfo 
set  shipfirstname='kkk' 
where CustomerId='134' 
order by 
     OredrGUID desc; 
+0

Một số thông tin sẽ tốt đẹp? Bảng thông tin? Dữ liệu mẫu? – Tim

Trả lời

21

tại sao không bạn cần làm:

update ShipBillInfo 
set shipfirstname='kkk' 
where OrderGUID = (select top (1) OrderGUID 
        from ShipBillInfo 
        where CustomerId = 134 
        order by OredrGUID desc) 
+0

Hãy nhận biết rằng điều này không xử lý đồng thời, vì vậy trong các cuộc gọi đồng thời, nó có thể cập nhật cùng một hàng hai lần – fabriciorissetto

25
With cte as (
select top(1) shipfirtsname 
From ShipBillInfo 
where CustomerId='134' 
order by OredrGUID desc) 
Update cte set shipfirstname='abc'; 
+0

Điều này hoạt động tốt hơn khi tham gia các bảng –

+1

Hãy cẩn thận với đồng thời trên ... – ErikE

+0

@ErikE Ý của bạn là đa dạng (1: nhiều mối quan hệ bảng) hoặc bạn thực sự có nghĩa là đồng thời (nhiều hơn một người dùng/kết nối thay đổi cùng một hàng cùng một lúc)? – yzorg

6

chủ đề Safe

Đối với giải pháp an toàn chủ đề, không có giải pháp nào được đề xuất làm việc cho tôi (một số hàng đã được cập nhật nhiều lần khi thực hiện cùng một lúc).

này làm việc:

UPDATE Account 
SET sg_status = 'A' 
WHERE AccountId = 
(
    SELECT TOP 1 AccountId 
    FROM Account WITH (UPDLOCK) --this makes it thread safe 
    ORDER BY CreationDate 
) 

Nếu bạn muốn quay trở lại một số cột của mặt hàng được cập nhật, bạn có thể đặt điều này trong báo cáo cập nhật của bạn: OUTPUT INSERTED.AccountId (giữa SETWHERE)

Các vấn đề liên quan